5

iOS で sqlite に複数のリーダーを使用すると、exc_bad_access が発生します。データベースで WAL が有効になっており、sqlite3_threadsafety が 2 を返すため、これは問題になりません。

私が使用しているコードは、ほとんどの場合、10 万人以上のユーザーに対して正常に動作しますが、特定のマルチスレッド競合状態により、sqlite3_prepare_v2 が exc_bad_access を持つようになります。基本的に、2 つのスレッドを生成して大量の読み取りを行うと、クラッシュします。

WAL とスレッドセーフな sqlite を使用すると、複数のスレッドが問題になることはありませんが、この exc_bad_access の原因を突き止めることはできません。

前もって感謝します。

4

1 に答える 1

5

その意味で、SQLite3 はスレッド セーフではありません。SQLite ドキュメントを参照してください。

「スレッドセーフ」とは、異なるスレッドで異なる SQLite データベース接続を同時に使用できることを意味します。複数のスレッドで同じデータベース接続を同時に使用することは安全ではありません。sqlite3_prepare() API を使用して準備済みステートメントを作成する場合、各準備済みステートメントは、派生元のデータベース接続の一部と見なされます。そのため、同じデータベース接続から発信された 2 つのプリペアド ステートメントを異なるスレッドで同時に実行することはできません。

于 2013-06-13T13:26:21.827 に答える