32.20. Поведение в многопоточных программах#

32.20. Поведение в многопоточных программах

32.20. Поведение в многопоточных программах

libpq по умолчанию является реентерабельным и потокобезопасным. Возможно, вам потребуется использовать специальные параметры командной строки компилятора при компиляции кода вашего приложения. Обратитесь к документации вашей системы для получения информации о том, как создавать потоковые приложения, или посмотрите в src/Makefile.global для PTHREAD_CFLAGS и PTHREAD_LIBS. Эта функция позволяет проверить потокобезопасность libpq:

PQisthreadsafe

Возвращает статус потокобезопасности библиотеки libpq.

int PQisthreadsafe();

Возвращает 1, если libpq является потокобезопасным, и 0, если нет.

Ограничение одного потока заключается в том, что два потока не могут одновременно манипулировать одним и тем же объектом PGconn. В частности, нельзя одновременно выполнять команды из разных потоков через один и тот же объект соединения. (Если вам нужно выполнять параллельные команды, используйте несколько соединений).

Объекты PGresult обычно доступны только для чтения после создания и могут свободно передаваться между потоками. Однако, если вы используете любые из функций изменения PGresult, описанных в Раздел 32.12 или Раздел 32.14, необходимо избегать одновременных операций с одним и тем же PGresult.

Все устаревшие функции PQrequestCancel и PQoidStatus не являются потокобезопасными и не должны использоваться в многопоточных программах. PQrequestCancel может быть заменена на PQcancel. PQoidStatus может быть заменена на PQoidValue.

Если вы используете Kerberos внутри вашего приложения (в дополнение к использованию внутри библиотеки libpq), вам потребуется выполнять блокировку вокруг вызовов Kerberos, поскольку функции Kerberos не являются потокобезопасными. См. функцию PQregisterThreadLock в исходном коде библиотеки libpq для способа совместной блокировки между libpq и вашим приложением.