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