34.19. 线程程序中的行为

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

  • PQisthreadsafe
    • 返回 libpq 库的线程安全状态。
int PQisthreadsafe();

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

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

PGresult对象通常在创建后是只读的,因此可以在线程之间自由传递。但是,如果您使用Section 34.11Section 34.13中描述的PGresult修改功能,则也要避免对同一PGresult进行并发操作。

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

如果在应用程序内部(除了 libpq 内部)使用 Kerberos,则由于 Kerberos 函数不是线程安全的,因此您将需要对 Kerberos 调用进行锁定。有关在 libpq 和您的应用程序之间进行协作锁定的方法,请参见 libpq 源代码中的函数PQregisterThreadLock

如果您在使用线程应用程序时遇到问题,请在src/tools/thread中运行该程序,以查看您的平台是否具有线程不安全功能。该程序由configure运行,但是对于二进制发行版,您的库可能与用于构建二进制文件的库不匹配。