★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

31.19. スレッド化プログラムの振舞い

デフォルトでlibpqは再入可能、かつ、スレッドセーフです。 アプリケーションコードをコンパイルする時にコンパイラの特殊なコマンドラインオプションを使う必要があるかもしれません。 スレッドを有効にしたアプリケーションの構築方法についての情報は、使用するシステムの文書を参照してください。 また、PTHREAD_CFLAGSPTHREAD_LIBSに関してsrc/Makefile.globalも一読してください。 以下の関数により、libpqのスレッドセーフ状態を確認することができます。

PQisthreadsafe

libpqライブラリのスレッドセーフ状態を返します。

int PQisthreadsafe();

libpqがスレッドセーフの場合1が、さもなくば0が返ります。

スレッドに関する1つの制限として、異なるスレッドから同時に同一のPGconnオブジェクトを操作することはできません。 具体的には、異なるスレッドから同一接続オブジェクトを介してコマンドを同時に発行することができません。 (コマンドの同時実行が必要な場合、接続を複数使用してください。)

PGresultオブジェクトは生成後、読み込み専用であり、そのためスレッド間で自由に渡すことができます。 しかし31.11. 雑多な関数31.13. イベントシステムで説明するPGresultを変更する関数のいずれかを使用している場合、同一のPGresultに対する同時操作を防ぐことも、作成者の責任です。

非推奨の関数、PQrequestCancelPQoidStatusはスレッドセーフではありませんので、マルチスレッドプログラムでは使用してはなりません。 PQrequestCancelPQcancelに、PQoidStatusPQoidValueに置き換えることができます。

(libpqの内部に加えて)アプリケーション中でKerberosを利用している場合、Kerberos関数はスレッドセーフではありませんのでKerberos呼び出しの前後をロックする必要があるでしょう。 libpqとアプリケーション間のロック処理を協調させる方法としてlibpqのソースコードのPQregisterThreadLock関数を参照してください。

スレッドアプリケーションで問題が起きた場合、src/tools/thread内のプログラムを実行して、プラットフォームがスレッドセーフではない関数を持っていないかどうか確認してください。 このプログラムはconfigureより実行されますが、バイナリ配布物の場合は、バイナリ構築時のライブラリとシステムのライブラリが一致しない可能性があります。