Документация по PostgreSQL 9.4.1 | |||
---|---|---|---|
Пред. | Уровень выше | Глава 31. libpq — библиотека для языка C | След. |
31.19. Поведение в многопоточных программах
Библиотека libpq по умолчанию поддерживает повторные вызовы и многопоточность. Для соответствующего варианта сборки вашего приложения вам может понадобиться передать компилятору специальные параметры командной строки. Чтобы узнать, как собрать многопоточное приложение, обратитесь к документации вашей системы или поищите в файле src/Makefile.global значения PTHREAD_CFLAGS и PTHREAD_LIBS. Эта функция позволяет узнать, поддерживает ли libpq многопоточность:
Реализация многопоточности не лишена ограничений: два потока не должны пытаться одновременно работать с одним объектом PGconn. В частности, не допускается параллельное выполнение команд из разных потоков через один объект соединения. (Если вам нужно выполнять команды одновременно, используйте несколько соединений.)
Объекты PGresult после создания обычно доступны только для чтения, и поэтому их можно свободно передавать между потоками. Однако, если вы используете какую-либо из функций, изменяющих PGresult, описанных в Разделе 31.11 или Разделе 31.13, вы должны также избегать одновременных обращений к одному объекту PGresult.
Устаревшие функции PQrequestCancel
и PQoidStatus
не являются потокобезопасными и не должны применяться в многопоточных программах. Вместо PQrequestCancel
можно использовать PQcancel
, а вместо PQoidStatus
— PQoidValue
.
Если вы применяете Kerberos в своём приложении (помимо возможного использования внутри libpq), вы должны обеспечить блокировку вокруг вызовов Kerberos, так как функции Kerberos не являются потокобезопасными. Обратите внимание на функцию PQregisterThreadLock
в исходном коде libpq, позволяющую организовать совместные блокировки между libpq и вашим приложением.
Если вы сталкиваетесь с проблемами многопоточности в приложениях, запустите программу src/tools/thread, чтобы понять, есть ли в вашей системе небезопасные при многопоточности функции. Эта программа запускается скриптом configure, но если вы устанавливаете двоичный пакет, ваши библиотеки могут не соответствовать тем, что использовались при сборке.
Пред. | Начало | След. |
Поддержка SSL | Уровень выше | Сборка программ с libpq |