受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

32.20. 在线程化程序中的行为 #

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

PGresult对象在创建后通常是只读的,因此可以在线程之间自由传递。不过,如果你使用Section 32.12Section 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源代码中的PQregisterThreadLock函数,它提供了一种在libpq与应用程序之间协作加锁的方法。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。