28.14. 在多线程程序里的行为

如果在制作 PostgreSQL 发布的时候,使用了 configure 的命令行参数 --enable-thread-safety, 那么 libpq 是可重入的并且是线程安全的。另外,在你编译自己的应用代码时, 可能需要使用额外的编译器命令行选项。请参考你的系统的文档获取有关如何编译多线程应用的信息。 或者查阅 src/Makefile.global,找 PTHREAD_CFLAGSPTHREAD_LIBS

一个现实是,两个线程不能试图同时操作同一个 PGconn 对象。 特别是,你不能从不同的线程里通过同一个连接对象发出并发的命令。 (如果你需要运行并行命令,请使用多个连接。)

PGresult对象在创建后是只读的,因此可以自由地在线程之间传递。

过时了的函数 PQoidStatusPQoidStatus 都是线程不安全的, 因此不应该在一个多线程的程序里面使用。 PQrequestCancel 可以由 PQcancel 代替。 PQoidStatus 可以由 PQoidValue代替。

如果在你的应用内部使用了 Kerberos (而不仅仅是 libpq 里面), 你就需要在 Kerberos 调用周围锁住,因为 Kerberos 函数不是线程安全的。 参阅 libpq 源代码里面的 PQregisterThreadLock 获取一个在 libpq 和你的应用之间进行恰当锁定的方法。

如果你的线程应用有问题,那么运行一个在 src/tools/thread 里的程序, 看看你的平台是否有线程安全的函数。这个程序由 configure 运行, 但如果是二进制版本,你的库可能就不能和制作二进制的那个库匹配了。