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 のコンパイル時に SQLITE_THREADSAFE =1 パラメーターが追加されると、デフォルトで有効になります。 SQLITE_THREADSAFE が 0 でない場合は、SQLite を初期化する前に sqlite3_config(SQLITE_CONFIG_SERIALIZED) を呼び出して有効にするか、データベース接続の作成時に SQLITE_OPEN_FULLMUTEX フラグを設定します。 ここで言う初期化とは、sqlite3_initialize()
関数
を呼び出すことを指します。この関数は、sqlite3_open()を呼び出すときに自動的に呼び出され、最初の呼び出しのみが有効です。スレッドセーフを達成するために、SQLiteはコンパイルされます。 SQLITE_THREADSAFE 前処理マクロは 1 に設定する必要があります。 Windows と
では、これは適切にコンパイルされたバイナリ ディストリビューションの設定です。使用しているライブラリがスレッドセーフかどうか不明な場合は、sqlite3_threadsafe() interface を呼び出して確認できます。 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){ return SQLITE_THREADSAFE } コンパイル時にシングルスレッド モードが指定されている場合、重要な相互排他ロジックは実行中に省略されます。そのため、起動時または実行時にシリアル モードまたはマルチスレッド モードを指定する方法はありません。 起動時にスレッド モードを選択する
実行時にスレッド モードを選択する
コンパイル時および起動時にシングル スレッド モードが指定されていない場合、各データベース接続の作成時にマルチスレッド モードまたはシリアル モードとして個別に指定できますが、シングル スレッド モードとして指定することはできません。コンパイル時または起動時にシングルスレッド モードが指定されている場合、接続の作成時にマルチスレッド モードまたはシリアル モードを指定することはできません。
sqlite3_open_v2() 関数の 3 番目のパラメーターを使用して、接続を作成するときにスレッド モードを指定します。 SQLITE_OPEN_NOMUTEX はマルチスレッド モードで作成された接続を識別し、SQLITE_OPEN_FULLMUTEX はシリアル モードで作成された接続を識別します。識別子が指定されていない場合、または sqlite3_open() 関数または sqlite3_open16() 関数を使用してデータベース接続を作成した場合、コンパイル時または起動時に指定されたスレッド モードがデフォルトのスレッド モードとして使用されます。
【関連おすすめ】
3.
以上がSQLiteマルチスレッドの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。