从版本 17 开始,libpq 始终是可重入和线程安全的。但是,有一项限制是,任何两个线程不能同时操作同一个 PGconn 对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)
PGresult 对象在创建后通常是只读的,因此可以自由地在线程之间传递。libpq 但是,如果您使用第 32.12 节或第 32.14 节中描述的任何 PGresult 修改函数,那么您也需要自己避免对同一个 PGresult 进行并发操作。
在早期版本中,libpq 可以根据编译器选项选择是否支持线程。此函数允许查询 libpq 的线程安全状态
PQisthreadsafe #返回 libpq 库的线程安全状态。
int PQisthreadsafe();
如果 libpq 是线程安全的,则返回 1,如果不是,则返回 0。对于版本 17 及以上版本,始终返回 1。
已弃用的函数 PQrequestCancel 和 PQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以被 PQcancelBlocking 替换。PQoidStatus 可以被 PQoidValue 替换。
如果您在应用程序中使用 Kerberos(除了在 libpq 内部使用),您将需要围绕 Kerberos 调用进行锁定,因为 Kerberos 函数不是线程安全的。有关在 libpq 和您的应用程序之间进行协作锁定的方法,请参阅 libpq 源代码中的 PQregisterThreadLock 函数。
同样,如果您在应用程序中使用 Curl,并且您在启动新线程之前没有全局初始化 libcurl,那么您将需要围绕任何可能初始化 libcurl 的代码进行协作锁定(同样通过 PQregisterThreadLock)。对于构建为支持线程安全初始化的较新版本的 Curl,此限制已解除;这些构建可以通过其版本元数据中对 threadsafe 功能的声明来识别。