31.20. Поведение в многопоточных программах#
31.20. Поведение в многопоточных программах #
libpq по умолчанию является реентерабельным и потокобезопасным.
Возможно, вам потребуется использовать специальные параметры командной строки компилятора
при компиляции кода вашего приложения. Обратитесь к документации вашей
системы для получения информации о том, как создавать
потоковые приложения, или посмотрите в
src/Makefile.global
для PTHREAD_CFLAGS
и PTHREAD_LIBS
. Эта функция позволяет проверить потокобезопасность
libpq:
PQisthreadsafe
#Возвращает статус потокобезопасности библиотеки libpq.
int PQisthreadsafe();
Возвращает 1, если libpq является потокобезопасным, и 0, если нет.
Ограничение одного потока заключается в том, что два потока не могут одновременно манипулировать одним и тем же объектом PGconn
. В частности, нельзя одновременно выполнять команды из разных потоков через один и тот же объект соединения. (Если вам нужно выполнять параллельные команды, используйте несколько соединений).
Объекты PGresult
обычно доступны только для чтения после создания и могут свободно передаваться между потоками. Однако, если вы используете любые из функций изменения PGresult
, описанных в Раздел 31.12 или Раздел 31.14, необходимо избегать одновременных операций с одним и тем же PGresult
.
Все устаревшие функции PQrequestCancel
и
PQoidStatus
не являются потокобезопасными и не должны использоваться в многопоточных программах. PQrequestCancel
может быть заменена на PQcancel
.
PQoidStatus
может быть заменена на
PQoidValue
.
Если вы используете Kerberos внутри вашего приложения (в дополнение к использованию внутри библиотеки libpq), вам потребуется выполнять блокировку вокруг вызовов Kerberos, поскольку функции Kerberos не являются потокобезопасными. См. функцию PQregisterThreadLock
в исходном коде библиотеки libpq для способа совместной блокировки между libpq и вашим приложением.