Skip to content

34.20. 多线程程序中的行为#

libpq默认情况下是可重入且线程安全的。编译应用程序代码时,您可能需要使用特殊的编译器命令行选项。有关如何构建支持线程的应用程序的信息,请参阅系统的文档,或在src/Makefile.global中查找PTHREAD_CFLAGSPTHREAD_LIBS。此函数允许查询libpq的线程安全状态

PQisthreadsafe #

返回 libpq 库的线程安全状态。

int PQisthreadsafe();

如果 libpq 是线程安全的,则返回 1,否则返回 0。

一个线程限制是,不允许两个线程同时尝试操作同一个PGconn对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)

PGresult对象通常在创建后是只读的,因此可以在线程之间自由传递。但是,如果您使用第 34.12 节第 34.14 节中描述的任何修改PGresult的函数,则由您来避免对同一个PGresult执行并发操作。

已弃用的函数PQrequestCancelPQoidStatus不是线程安全的,不应在多线程程序中使用。PQrequestCancel可以替换为PQcancelPQoidStatus可以替换为PQoidValue

如果您在应用程序中使用 Kerberos(除了在libpq中),您需要对 Kerberos 调用进行锁定,因为 Kerberos 函数不是线程安全的。请参阅libpq源代码中的函数PQregisterThreadLock,了解在libpq和您的应用程序之间进行协作锁定的方法。