On this page
33.19. 线程程序中的行为
libpq 默认为可重入且线程安全的。编译应用程序代码时,可能需要使用特殊的编译器命令行选项。有关如何构建启用线程的应用程序的信息,请参阅系统的文档,或者在src/Makefile.global
中查找PTHREAD_CFLAGS
和PTHREAD_LIBS
。此函数允许查询 libpq 的线程安全状态:
int PQisthreadsafe();
如果 libpq 是线程安全的,则返回 1,否则返回 0.
一种线程限制是,没有两个线程会尝试同时操作相同的PGconn
对象。特别是,您不能通过同一连接对象从不同线程发出并发命令。 (如果需要运行并发命令,请使用多个连接.)
PGresult
对象通常在创建后是只读的,因此可以在线程之间自由传递。但是,如果您使用Section 33.11或Section 33.13中描述的PGresult
修改功能,则也要避免对同一PGresult
进行并发操作。
不建议使用的函数PQrequestCancel
和PQoidStatus
不是线程安全的,因此不应在多线程程序中使用。 PQrequestCancel
可以替换为PQcancel
。 PQoidStatus
可以替换为PQoidValue
。
如果在应用程序内部(除了 libpq 内部)使用 Kerberos,则由于 Kerberos 函数不是线程安全的,因此您将需要对 Kerberos 调用进行锁定。有关在 libpq 和您的应用程序之间进行协作锁定的方法,请参见 libpq 源代码中的函数PQregisterThreadLock
。
如果您在使用线程应用程序时遇到问题,请在src/tools/thread
中运行该程序,以查看您的平台是否具有线程不安全功能。该程序由configure
运行,但是对于二进制发行版,您的库可能与用于构建二进制文件的库不匹配。