34.19. Поведение в многопоточных программах
Библиотека libpq по умолчанию поддерживает повторные вызовы и многопоточность. Для соответствующего варианта сборки вашего приложения вам может понадобиться передать компилятору специальные параметры командной строки. Чтобы узнать, как собрать многопоточное приложение, обратитесь к документации вашей системы или поищите в файле src/Makefile.global
значения PTHREAD_CFLAGS
и PTHREAD_LIBS
. Эта функция позволяет узнать, поддерживает ли libpq многопоточность:
Реализация многопоточности не лишена ограничений: два потока не должны пытаться одновременно работать с одним объектом PGconn
. В частности, не допускается параллельное выполнение команд из разных потоков через один объект соединения. (Если вам нужно выполнять команды одновременно, используйте несколько соединений.)
Объекты PGresult
после создания обычно доступны только для чтения, и поэтому их можно свободно передавать между потоками. Однако если вы используете какую-либо из функций, изменяющих PGresult
, описанных в Разделе 34.11 или Разделе 34.13, вы должны также избегать одновременных обращений к одному объекту PGresult
.
Устаревшие функции PQrequestCancel
и PQoidStatus
не являются потокобезопасными и не должны применяться в многопоточных программах. Вместо PQrequestCancel
можно использовать PQcancel
, а вместо PQoidStatus
— PQoidValue
.
Если вы применяете Kerberos в своём приложении (помимо возможного использования внутри libpq), вы должны обеспечить блокировку вокруг вызовов Kerberos, так как функции Kerberos не являются потокобезопасными. Обратите внимание на функцию PQregisterThreadLock
в исходном коде libpq, позволяющую организовать совместные блокировки между libpq и вашим приложением.
34.19. Behavior in Threaded Programs
libpq is reentrant and thread-safe by default. You might need to use special compiler command-line options when you compile your application code. Refer to your system's documentation for information about how to build thread-enabled applications, or look in src/Makefile.global
for PTHREAD_CFLAGS
and PTHREAD_LIBS
. This function allows the querying of libpq's thread-safe status:
One thread restriction is that no two threads attempt to manipulate the same PGconn
object at the same time. In particular, you cannot issue concurrent commands from different threads through the same connection object. (If you need to run concurrent commands, use multiple connections.)
PGresult
objects are normally read-only after creation, and so can be passed around freely between threads. However, if you use any of the PGresult
-modifying functions described in Section 34.11 or Section 34.13, it's up to you to avoid concurrent operations on the same PGresult
, too.
The deprecated functions PQrequestCancel
and PQoidStatus
are not thread-safe and should not be used in multithread programs. PQrequestCancel
can be replaced by PQcancel
. PQoidStatus
can be replaced by PQoidValue
.
If you are using Kerberos inside your application (in addition to inside libpq), you will need to do locking around Kerberos calls because Kerberos functions are not thread-safe. See function PQregisterThreadLock
in the libpq source code for a way to do cooperative locking between libpq and your application.