Начиная с версии 17, libpq всегда является реентерабельной и потокобезопасной. Однако одним из ограничений является то, что два потока не должны одновременно манипулировать одним и тем же PGconn объектом conn. В частности,
нельзя выполнять параллельные команды из разных потоков через
один и тот же объект соединения. (Если необходимо выполнять команды параллельно,
используйте несколько соединений.)
PGresult объекты после создания обычно доступны только для чтения
и поэтому могут свободно передаваться между потоками. Однако, если используются
какие-либо PGresult-модифицирующие функции, описанные в
Раздел 4.1.12 или Раздел 4.1.14, ответственность за предотвращение одновременных операций с одним и тем же объектом возлагается на разработчика PGresult,
также.
В более ранних версиях libpq библиотека могла быть скомпилирована с поддержкой многопоточности или без неё в зависимости от параметров компилятора. Данная функция позволяет запросить libpqстатус потокобезопасности библиотеки :
PQisthreadsafe #Возвращает статус потокобезопасности библиотеки libpq libpq.
int PQisthreadsafe();
Возвращает 1, если библиотека libpq является потокобезопасной и 0, если нет. В версии 17 и выше всегда возвращается значение 1.
Устаревшие функции PQrequestCancel и
PQoidStatus не являются потокобезопасными и не должны использоваться в многопоточных программах. PQrequestCancel
могут быть заменены функцией PQcancelBlocking.
PQoidStatus могут быть заменены функцией
PQoidValue.
Если Kerberos используется внутри приложения (в дополнение к использованию в
libpq), необходимо выполнять блокировку при
вызовах функций Kerberos, так как они не являются потокобезопасными. См.
функцию PQregisterThreadLock в
libpq исходном коде способ реализации совместной блокировки между libpq и вашим приложением.