Postgresql 中文操作指南
34.20. Behavior in Threaded Programs #
libpq 在默认情况下是可重入和线程安全的。您可能需要在编译应用程序代码时使用特殊的编译器命令行选项。有关如何构建线程启用应用程序的信息,请参阅您系统的文档或在 src/Makefile.global 中查找 PTHREAD_CFLAGS 和 PTHREAD_LIBS。此函数允许查询 libpq 的线程安全状态:
-
PQisthreadsafe #
-
返回 libpq 库的线程安全状态。
-
int PQisthreadsafe();
-
如果 libpq 是线程安全的,则返回 1;如果不安全,则返回 0。
一个线程限制是,不允许两个线程同时尝试处理同一个 PGconn 对象。特别是,不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)
PGresult 对象通常在创建后为只读,因此可在线程之间自由传递。但是,如果您使用 Section 34.12 或 Section 34.14 中描述的任何 PGresult 修改函数,则由您避免对同一 PGresult 执行并发操作。
弃用的函数 PQrequestCancel 和 PQoidStatus 不是线程安全的,不应用于多线程程序中。 PQrequestCancel 可以替换 PQcancel 。 PQoidStatus 可以替换 PQoidValue 。
如果您在应用程序中(以及在 libpq 中)使用 Kerberos,则需要锁定 Kerberos 调用,因为 Kerberos 函数不是线程安全的。请参阅 libpq 源代码中的函数 PQregisterThreadLock,了解在 libpq 和应用程序之间进行协作锁定的方法。