Поведение в многопоточных программах
libpq по умолчанию допускает многократные вызовы и ориентирована на многопоточное выполнение. Для реализации этого при компиляции кода вашего приложения вам может понадобиться передать компилятору специальные параметры командной строки. За информацией о том, как собрать многопоточное приложение, обратитесь к документации вашей системы. Эта функция позволяет запросить статус libpq относительно многопоточности:
PQisthreadsafe
Возвращает статус потокобезопасности библиотеки libpq.
int PQisthreadsafe();
Возвращает 1, если libpq потокобезопасна, и 0 в противном случае.
Одно из ограничений многопоточности заключается в том, что два потока не должны пытаться одновременно манипулировать одним объектом PGconn. В частность, нельзя параллельно выполнять команды из разных потоков через один объект подключения. (Если вам нужно запустить команды параллельно, используйте несколько подключений.)
Как правило, объекты PGresult после создания доступны только для чтения, поэтому их можно свободно передавать между потоками. Однако если вы используете какую-либо из модифицирующих PGresult функций, описанных в разделе Прочие функции или Система событий, вам тоже следует избегать одновременных операций с одним объектом PGresult.
Устаревшие функции PQrequestCancel и PQoidStatus не ориентированы на многопоточное выполнение и не должны использоваться в многопоточных программах. PQrequestCancel можно заменить функцией PQcancel, а PQoidStatus — функцией PQoidValue.
Если вы используете в своем приложении Kerberos (помимо использования в libpq), вам понадобится обеспечить блокировку вокруг вызовов Kerberos, поскольку функции Kerberos не ориентированы на многопоточное выполнение. Организовать совместные блокировки между libpq и вашим приложением можно с помощью функции PQregisterThreadLock, имеющейся в исходном коде libpq.