如果在制作 PostgreSQL 发布的时候,使用了 configure 的命令行参数 --enable-thread-safety, 那么 libpq 是可重入的并且是线程安全的。另外,在你编译自己的应用代码时, 可能需要使用额外的编译器命令行选项。请参考你的系统的文档获取有关如何编译多线程应用的信息。 或者查阅 src/Makefile.global,找 PTHREAD_CFLAGS 和 PTHREAD_LIBS。
一个现实是,两个线程不能试图同时操作同一个 PGconn 对象。 特别是,你不能从不同的线程里通过同一个连接对象发出并发的命令。 (如果你需要运行并行命令,请使用多个连接。)
PGresult对象在创建后是只读的,因此可以自由地在线程之间传递。
过时了的函数 PQoidStatus
和
PQoidStatus
都是线程不安全的,
因此不应该在一个多线程的程序里面使用。
PQrequestCancel
可以由 PQcancel
代替。
PQoidStatus
可以由
PQoidValue
代替。
如果在你的应用内部使用了 Kerberos (而不仅仅是 libpq 里面),
你就需要在 Kerberos 调用周围锁住,因为 Kerberos 函数不是线程安全的。
参阅 libpq 源代码里面的 PQregisterThreadLock
获取一个在 libpq 和你的应用之间进行恰当锁定的方法。
如果你的线程应用有问题,那么运行一个在 src/tools/thread 里的程序, 看看你的平台是否有线程安全的函数。这个程序由 configure 运行, 但如果是二进制版本,你的库可能就不能和制作二进制的那个库匹配了。