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

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

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

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

过时了的函数 PQoidStatusPQoidStatusfe_setauthsvc 都是线程不安全的, 因此不应该在一个多线程的程序里面使用。 PQrequestCancel 可以由 PQcancel 代替。 PQoidStatus 可以由 PQoidValue代替。而我们觉得根本没有调用 fe_setauthsvc 的必要。

libpq 客户端使用的 crypt 加密方法倚赖 crypt() 系统函数,它通常不是线程安全的。 我们最好使用 MD5 加密,它在所有平台上是线程安全的。

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