从 17 版本开始,libpq 始终是可重入且线程安全的。但是,有一个限制是,任何两个线程都不能同时尝试操作同一个 PGconn
对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果需要运行并发命令,请使用多个连接。)
PGresult
对象通常在创建后是只读的,因此可以在线程之间自由传递。但是,如果您使用第 32.12 节或第 32.14 节中描述的任何 PGresult
修改函数,则您也需要避免对同一个 PGresult
进行并发操作。
在早期版本中,libpq 可以使用或不使用线程支持进行编译,具体取决于编译器选项。此函数允许查询 libpq 的线程安全状态。
PQisthreadsafe
#返回 libpq 库的线程安全状态。
int PQisthreadsafe();
如果 libpq 是线程安全的,则返回 1;如果不是,则返回 0。在 17 及更高版本上始终返回 1。
已弃用的函数 PQrequestCancel
和 PQoidStatus
不是线程安全的,不应在多线程程序中使用。PQrequestCancel
可以由 PQcancelBlocking
替代。PQoidStatus
可以由 PQoidValue
替代。
如果您在应用程序内部(除了 libpq 内部)使用 Kerberos,您需要在 Kerberos 调用周围进行锁定,因为 Kerberos 函数不是线程安全的。请参阅 libpq 源代码中的函数 PQregisterThreadLock
,了解如何在 libpq 和您的应用程序之间进行协同锁定的方法。
如果您发现文档中有任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单来报告文档问题。