Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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