↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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 / 7.0
历史版本。 PostgreSQL 12 已结束支持。 2024-11-21. 请参阅 当前版本手册.

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

libpq 默认是可重入且线程安全的。编译应用程序代码时,可能需要使用特殊的编译器命令行选项。有关如何构建支持线程的应用程序,请参阅系统文档,或查看 src/Makefile.global 中的 PTHREAD_CFLAGS 和 PTHREAD_LIBS。以下函数可用于查询 libpq 的线程安全状态:

PQisthreadsafe #

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

int PQisthreadsafe();

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

线程使用的一项限制是:两个线程不能同时操作同一个 PGconn 对象。尤其不能通过同一个连接对象从不同线程并发发出命令。(如果需要并发执行命令,请使用多个连接。)

PGresult 对象在创建后通常是只读的,因此可以在线程之间自由传递。不过,如果你使用第 33.11 节或第 33.13 节中描述的任何会修改 PGresult 的函数,则需要自行避免对同一个 PGresult 执行并发操作。

已弃用的函数 PQrequestCancel 和 PQoidStatus 不是线程安全的,不应在多线程程序中使用。PQrequestCancel 可以用 PQcancel 替代;PQoidStatus 可以用 PQoidValue 替代。

如果你在应用程序中使用 Kerberos(除了 libpq 内部之外),则需要在 Kerberos 调用周围加锁,因为 Kerberos 函数不是线程安全的。可参考 libpq 源代码中的 PQregisterThreadLock 函数,它提供了一种在 libpq 与应用程序之间协作加锁的方法。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.