【JPUG主催】PostgreSQLカンファレンス2020【11月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

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

PostgreSQL配布物からの構築時のconfigureコマンドラインオプションに--enable-thread-safetyが使用されていた場合、libpqは再入可能、かつ、スレッドセーフです。 更に、アプリケーションコードをコンパイルする時にコンパイラのコマンドラインオプションに追加する必要があるかもしれません。 スレッドを有効にしたアプリケーションの構築方法についての情報は、使用するシステムの文書を参照してください。 また、PTHREAD_CFLAGSPTHREAD_LIBSに関してsrc/Makefile.globalも一読してください

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

PGresult オブジェクトは生成後、読み込み専用となります。 従って、スレッド間を自由に渡ることができます。

推奨されない関数PQrequestCancelPQoidStatusfe_setauthsvcはスレッドセーフではありませんので、マルチスレッドプログラムで使用すべきではありません。 PQrequestCancelPQcancelに、PQoidStatusPQoidValueに置き換えることができます。 いかなる場合においても、fe_setauthsvcは呼び出すべきではありません。

crypt認証方式を使用したLibpqアプリケーションはcrypt()オペレーティングシステム関数に依存します。 この関数はスレッドセーフではない場合が多くあります。 全てのプラットフォームでスレッドセーフなmd5方式を使用する方が良いでしょう。

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