SQLite は 3 つのスレッド モードをサポートしています:
シングル スレッド: このモードでは相互排他がなく、マルチスレッドは安全ではありません。すべてのミューテックス ロックを無効にすると、同時に使用するとエラーが発生します。これは、SQLite のコンパイル時に SQLITE_THREADSAFE=0 パラメーターが追加された場合、または SQLite を初期化する前に sqlite3_config(SQLITE_CONFIG_SINGLETHREAD) が呼び出された場合に有効になります。
マルチスレッド: このモードでは、複数のスレッドによって同時に使用されない限り、データベース接続は安全です。ソース コードでは、bCoreMutex が有効になり、bFullMutex が無効になります。実際には、データベース接続を無効にするためのものであり、
ステートメント (準備されたステートメント) でロックされるため、同じデータベース接続または準備されたものを複数のスレッドで同時に使用することはできません
声明。 SQLite のコンパイル時に SQLITE_THREADSAFE=2 パラメーターを追加すると、デフォルトで有効になります。 SQLITE_THREADSAFE が 0 でない場合は、SQLite を初期化する前に sqlite3_config(SQLITE_CONFIG_MULTITHREAD) を呼び出して有効にするか、データベース接続の作成時に SQLITE_OPEN_NOMUTEX を設定します。
フラグ。
連載: SQLite はスレッドセーフです。 bCoreMutex および bFullMutex を含むすべてのロックを有効にする
。データベース接続と準備ができているので、
ステートメントはすべてロックされているため、複数のスレッドがこれらのオブジェクトを使用する場合、それらを同時に使用することはできず、シリアルになります。 SQLITE_THREADSAFE は SQLite のコンパイル時に追加されます
=1 パラメータはデフォルトで有効です。 SQLITE_THREADSAFE が 0 でない場合は、SQLite を初期化する前に sqlite3_config(SQLITE_CONFIG_SERIALIZED) を呼び出して有効にするか、データベース接続の作成時に SQLITE_OPEN_FULLMUTEX を設定します。
フラグ 。
ここで言う初期化とは、sqlite3_initialize() 関数の呼び出しを指します。この関数は sqlite3_open() を呼び出すときに自動的に呼び出され、最初の呼び出しのみが有効です。
スレッド セーフを実現するには、コンパイル時に SQLite をコンパイルする必要があります。 SQLITE_THREADSAFE プリプロセッサ マクロを 1 に設定します。 Windows と Linux では、 これは、適切にコンパイルされたバイナリ配布の設定です。使用しているライブラリがスレッドセーフかどうか不明な場合は、sqlite3_threadsafe() インターフェイスを呼び出して確認できます。 sqlite3_threadsafe() を呼び出して、コンパイル時の SQLITE_THREADSAFE パラメータを取得します。
つまり、スレッド モードは、コンパイル時 (SQLite ライブラリがソース コードからコンパイルされるとき)、起動時 (SQLite を使用するアプリケーションが初期化されるとき)、または実行時 (データベース接続の作成時) に指定できます。一般に、実行時に指定されたモードは起動時に指定されたモードをオーバーライドし、起動時に指定されたモードはコンパイル時に指定されたモードをオーバーライドします。ただし、シングルスレッド モードを指定すると、これをオーバーライドすることはできません。デフォルトのスレッド モードはシリアル モードです。
コンパイル時にスレッド モードを選択する
SQLITE_THREADSAFE マクロを定義することで、スレッド モードを指定できます。指定しない場合は、デフォルトでシリアル モードが使用されます。マクロ SQLITE_THREADSAFE=1 を定義してシリアル モードを指定し、=0 でシングル スレッド モードを使用し、=2 でマルチスレッド モードを使用します。
sqlite3_threadsafe() 関数の戻り値により、コンパイル時に指定されたスレッド モードを決定できます。シングルスレッド モードが指定されている場合、関数は false を返します。シリアルまたはマルチスレッド モードが指定されている場合、関数は true を返します。 sqlite3_threadsafe() 関数はマルチスレッド モードと起動時および実行時のモード選択に先行するため、マルチスレッド モードとシリアル モード、または起動モードと実行時モードを区別できません。
最後の文は、sqlite3_threadsafe 関数 SQLITE_API int の実装を通じて理解できます。
sqlite3_threadsafe(void){ SQLITE_THREADSAFE を返す;
コンパイル時にシングルスレッド モードが指定されている場合、重要なミューテックス ロジックが構築時に省略されるため、起動時または実行時にシリアル モードまたはマルチスレッド モードを指定することはできません。
起動時にスレッド モードを選択する
コンパイル時にシングル スレッド モードが指定されていない場合は、アプリケーションの初期化中に sqlite3_config() 関数を使用してスレッド モードを変更できます。パラメータ SQLITE_CONFIG_SINGLETHREAD はシングルスレッド モードとして、SQLITE_CONFIG_MULTITHREAD はマルチスレッド モードとして、SQLITE_CONFIG_SERIALIZED はシリアル モードとして指定できます。
コンパイル時または起動時にシングル スレッド モードが指定されていない場合、各データベース接続の作成時にマルチスレッド モードまたはシリアル モードとして個別に指定できますが、シングル スレッド モデルとして指定することはできません。コンパイル時または起動時にシングルスレッド モードが指定されている場合、接続の作成時にマルチスレッド モードまたはシリアル モードを指定することはできません。
sqlite3_open_v2() 関数の 3 番目のパラメーターを使用して、接続を作成するときにスレッド モードを指定します。 SQLITE_OPEN_NOMUTEX はマルチスレッド モードで作成された接続を識別し、SQLITE_OPEN_FULLMUTEX はシリアル モードで作成された接続を識別します。識別子が指定されていない場合、または sqlite3_open() 関数または sqlite3_open16() 関数を使用してデータベース接続を作成した場合、コンパイル時または起動時に指定されたスレッド モードがデフォルトのスレッド モードとして使用されます。