9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

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和应用之间做合作锁定的方法。