PostgreSQL 9.3.1 中文手册 | ||||
---|---|---|---|---|
Prev | Up | Chapter 31. libpq - C 库 | Next |
libpq是可重入的并且是线程安全的。另外, 在你编译自己的应用代码时,可能需要使用额外的编译器命令行选项。 参考你的系统的文档获取关于如果建立线程可用的应用的信息, 或在src/Makefile.global中查看PTHREAD_CFLAGS 和PTHREAD_LIBS。此功能允许查询libpq的线程安全状态:
一个线程限制是,两个线程不能试图同时操作同一个PGconn对象。特别是, 你不能从不同的线程里通过同一个连接对象发出并发的命令。(如果你需要运行并行命令, 请使用多个连接。)
PGresult对象在创建后是只读的,因此可以自由地在线程之间传递。然而, 如果你使用在Section 31.11和Section 31.13 中描述的任何PGresult修改函数,那么它也取决于你可以避免同一 PGresult上的并发操作。
过时了的函数PQrequestCancel
和PQoidStatus
都是线程不安全的,因此不应该在一个多线程的程序里面使用。PQrequestCancel
可以由PQcancel
代替。PQoidStatus
可以由
PQoidValue
代替。
如果在你的应用内部使用了 Kerberos (而不仅仅是libpq里面),
你就需要在 Kerberos 调用周围锁住,因为 Kerberos 函数不是线程安全的。
参阅libpq源代码里面的PQregisterThreadLock
获取一个在libpq和你的应用之间进行恰当锁定的方法。
如果你的线程应用有问题,那么运行一个在src/tools/thread里的程序, 看看你的平台是否有线程不安全的函数。这个程序由configure运行, 但如果是二进制版本,你的库可能就不能和制作二进制的那个库匹配了。