2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.21. 多线程程序中的行为 #

从版本 17 开始,libpq 始终是可重入和线程安全的。但是,有一项限制是,任何两个线程不能同时操作同一个 PGconn 对象。特别是,您不能通过同一个连接对象从不同的线程发出并发命令。(如果您需要运行并发命令,请使用多个连接。)

PGresult 对象在创建后通常是只读的,因此可以自由地在线程之间传递。libpq 但是,如果您使用第 32.12 节第 32.14 节中描述的任何 PGresult 修改函数,那么您也需要自己避免对同一个 PGresult 进行并发操作。

在早期版本中,libpq 可以根据编译器选项选择是否支持线程。此函数允许查询 libpq 的线程安全状态

PQisthreadsafe #

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

int PQisthreadsafe();

如果 libpq 是线程安全的,则返回 1,如果不是,则返回 0。对于版本 17 及以上版本,始终返回 1。

已弃用的函数 PQrequestCancelPQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以被 PQcancelBlocking 替换。PQoidStatus 可以被 PQoidValue 替换。

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

同样,如果您在应用程序中使用 Curl,并且您在启动新线程之前没有全局初始化 libcurl,那么您将需要围绕任何可能初始化 libcurl 的代码进行协作锁定(同样通过 PQregisterThreadLock)。对于构建为支持线程安全初始化的较新版本的 Curl,此限制已解除;这些构建可以通过其版本元数据中对 threadsafe 功能的声明来识别。

提交更正

如果您在文档中看到任何不正确的内容,与您在使用特定功能时的体验不符,或者需要进一步的解释,请使用 此表单 报告文档问题。