# 34.20.线程程序中的行为

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

PQisthreadsafe

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

int PQisthreadsafe();

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

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

PGresult对象在创建后通常是只读的,因此可以在线程之间自由传递。但是,如果您使用PGresult-修改中描述的函数第34.12节第34.14节,这取决于您如何避免在同一台计算机上执行并发操作PGresult

不推荐使用的函数请求取消状态不是线程安全的,不应在多线程程序中使用。请求取消可以替换为取消. 状态可以替换为pq值.

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