デフォルトでlibpqは再入可能、かつ、スレッドセーフです。
アプリケーションコードをコンパイルする時にコンパイラの特殊なコマンドラインオプションを使う必要があるかもしれません。
スレッドを有効にしたアプリケーションの構築方法についての情報は、使用するシステムの文書を参照してください。
また、PTHREAD_CFLAGS
とPTHREAD_LIBS
に関してsrc/Makefile.global
も一読してください。
以下の関数により、libpqのスレッドセーフ状態を確認することができます。
スレッドに関する1つの制限として、異なるスレッドから同時に同一のPGconn
オブジェクトを操作することはできません。
具体的には、異なるスレッドから同一接続オブジェクトを介してコマンドを同時に発行することができません。
(コマンドの同時実行が必要な場合、接続を複数使用してください。)
PGresult
オブジェクトは生成後、読み込み専用であり、そのためスレッド間で自由に渡すことができます。
しかし32.11. 雑多な関数や32.13. イベントシステムで説明するPGresult
を変更する関数のいずれかを使用している場合、同一のPGresult
に対する同時操作を防ぐことも、作成者の責任です。
非推奨の関数、PQrequestCancel
やPQoidStatus
はスレッドセーフではありませんので、マルチスレッドプログラムでは使用してはなりません。
PQrequestCancel
はPQcancel
に、PQoidStatus
はPQoidValue
に置き換えることができます。
(libpqの内部に加えて)アプリケーション中でKerberosを利用している場合、Kerberos関数はスレッドセーフではありませんのでKerberos呼び出しの前後をロックする必要があるでしょう。
libpqとアプリケーション間のロック処理を協調させる方法としてlibpqのソースコードのPQregisterThreadLock
関数を参照してください。
スレッドアプリケーションで問題が起きた場合、src/tools/thread
内のプログラムを実行して、プラットフォームがスレッドセーフではない関数を持っていないかどうか確認してください。
このプログラムはconfigure
より実行されますが、バイナリ配布物の場合は、バイナリ構築時のライブラリとシステムのライブラリが一致しない可能性があります。