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 和您的应用程序之间进行协作锁定的方法。