バージョン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関数を参照してください。