libpq 默认是可重入且线程安全的。编译应用程序代码时,可能需要使用特殊的编译器命令行选项。有关如何构建支持线程的应用程序,请参阅系统文档,或查看 src/Makefile.global 中的 PTHREAD_CFLAGS 和 PTHREAD_LIBS。以下函数可用于查询 libpq 的线程安全状态:
PQisthreadsafe #返回libpq库的线程安全状态。
int PQisthreadsafe();
如果libpq是线程安全的则返回 1,否则返回 0。在版本 17 及以上始终返回 1。
线程使用的一项限制是:两个线程不能同时操作同一个 PGconn 对象。尤其不能通过同一个连接对象从不同线程并发发出命令。(如果需要并发执行命令,请使用多个连接。)
PGresult对象在创建后通常是只读的,因此可以在线程之间自由传递。不过,如果你使用Section 33.11或Section 33.13中描述的任何会修改PGresult的函数,则需要自行避免对同一个PGresult执行并发操作。
已弃用的 PQrequestCancel 和 PQoidStatus 函数不是线程安全的,不应在多线程程序中使用。可以用 PQcancel 替代 PQrequestCancel,用 PQoidValue 替代 PQoidStatus。
如果你在应用程序中使用 Kerberos(除了libpq内部之外),则需要在 Kerberos 调用周围加锁,因为 Kerberos 函数不是线程安全的。可参考libpq源代码中的PQregisterThreadLock函数,它提供了一种在libpq与应用程序之间协作加锁的方法。