登录
34.20. 多线程程序中的行为#
libpq默认情况下是可重入且线程安全的。编译应用程序代码时,您可能需要使用特殊的编译器命令行选项。有关如何构建支持线程的应用程序的信息,请参阅系统的文档,或在src/Makefile.global
中查找PTHREAD_CFLAGS
和PTHREAD_LIBS
。此函数允许查询libpq的线程安全状态
PQisthreadsafe
#返回 libpq 库的线程安全状态。
int PQisthreadsafe();
如果 libpq 是线程安全的,则返回 1,否则返回 0。
一个线程限制是,不允许两个线程同时尝试操作同一个PGconn
对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)
PGresult
对象通常在创建后是只读的,因此可以在线程之间自由传递。但是,如果您使用第 34.12 节或第 34.14 节中描述的任何修改PGresult
的函数,则由您来避免对同一个PGresult
执行并发操作。
已弃用的函数PQrequestCancel
和PQoidStatus
不是线程安全的,不应在多线程程序中使用。PQrequestCancel
可以替换为PQcancel
。PQoidStatus
可以替换为PQoidValue
。
如果您在应用程序中使用 Kerberos(除了在libpq中),您需要对 Kerberos 调用进行锁定,因为 Kerberos 函数不是线程安全的。请参阅libpq源代码中的函数PQregisterThreadLock
,了解在libpq和您的应用程序之间进行协作锁定的方法。