バージョン17では、libpqは常に再入可能でスレッドセーフです。
ただし、1つの制限として、2つのスレッドが同じPGconn
オブジェクトを同時に操作することはできません。
特に、異なるスレッドから同じ接続オブジェクトを介して同時にコマンドを実行することはできません。(並行してコマンドを実行する必要がある場合は、複数の接続を使用してください。)
PGresult
オブジェクトは生成後、読み込み専用であり、そのためスレッド間で自由に渡すことができます。
しかし32.12や32.14で説明するPGresult
を変更する関数のいずれかを使用している場合、同一のPGresult
に対する同時操作を防ぐことも、作成者の責任です。
以前のバージョンでは、libpqはコンパイラオプションに応じてスレッドサポート付きでコンパイルすることも、スレッドサポートなしでコンパイルすることもできました。 この関数はlibpqのスレッドセーフステータスを照会することができます。
PQisthreadsafe
#libpqライブラリのスレッドセーフ状態を返します。
int PQisthreadsafe();
libpqがスレッドセーフである場合は1を、そうでない場合は0を返します。 バージョン17以降では常に1を返します。
非推奨の関数、PQrequestCancel
やPQoidStatus
はスレッドセーフではありませんので、マルチスレッドプログラムでは使用してはなりません。
PQrequestCancel
はPQcancelBlocking
に置き換えられます。
PQoidStatus
はPQoidValue
に置き換えられます。
(libpqの内部に加えて)アプリケーション中でKerberosを利用している場合、Kerberos関数はスレッドセーフではありませんのでKerberos呼び出しの前後をロックする必要があるでしょう。
libpqとアプリケーション間のロック処理を協調させる方法としてlibpqのソースコードのPQregisterThreadLock
関数を参照してください。