从 17 版本开始,libpq 总能重新进入且是线程安全的。然而,有一个限制,即不能有二个线程尝试同时处理同一 PGconn
对象。具体而言,不能通过同一连接对象从不同的线程发起并发命令。(如果您需要运行并发命令,请使用多个连接。)
创建 PGresult
对象后,这些对象通常只读,所以可以在各线程之间自由传递。然而,如果您使用 第 32.12 节 或 第 32.14 节 中描述的任何修改 PGresult
的函数,您也有责任避免对同一 PGresult
进行并发操作。
在更早的版本中,libpq 可以根据编译器选项编译,支持或不支持线程。此函数允许查询 libpq 的线程安全状态
PQisthreadsafe
#返回 libpq 库的线程安全状态。
int PQisthreadsafe();
如果 libpq 是线程安全的,则返回 1,否则返回 0。始终返回 17 及更高版本的版本。
不推荐使用的函数 PQrequestCancel
和 PQoidStatus
不是线程安全的并且不应在多线程程序中使用。可以使用 PQcancelBlocking
替换 PQrequestCancel
。可以使用 PQoidValue
替换 PQoidStatus
。
如果您在应用程序中(除了在 libpq 中)使用 Kerberos,您将需要对 Kerberos 调用执行锁定,因为 Kerberos 函数不是线程安全的。请参阅 libpq 源代码中的 PQregisterThreadLock
函数以了解在 libpq 和您的应用程序之间进行协作锁定的方法。