天天看点

PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.19. 在线程化程序中的行为

33.19. 在线程化程序中的行为

libpq默认是可再入的并且是线程安全的。你可能需要使用特殊的编译器命令行选项来编译你的应用代码。参考你的系统文档来了解如何编译启用线程的应用,或者在

src/Makefile.global

中查找

PTHREAD_CFLAGS

PTHREAD_LIBS

。这个函数允许查询libpq的线程安全状态:

PQisthreadsafe

返回libpq库的线程安全状态。
int PQisthreadsafe();      
如果libpq是线程安全的则返回 1,否则返回 0。

一个线程限制是不允许两个线程同时尝试操纵同一个

PGconn

对象。特别是你不能从不同的线程通过同一个连接对象发出并发的命令(如果你需要运行并发命令,请使用多个连接)。

PGresult

对象在创建后通常是只读的,并且因此可以在线程之间自由地被传递。但是,如果你使用任何

第 33.11 节

第 33.13 节

中描述的

PGresult

修改函数,你需要负责避免在同一个

PGresult

上的并发操作。

被废弃的函数

PQrequestCancel

以及

PQoidStatus

不时线程安全的并且不应当在多线程程序中使用。

PQrequestCancel

可以被替换为

PQcancel

PQoidStatus

PQoidValue

如果你在应用中使用 Kerberos (除了在libpq中之外),你将需要对 Kerberos 调用加锁,因为 Kerberos 函数不是线程安全的。参考libpq源代码中的

PQregisterThreadLock

函数,那里有在libpq和应用之间做合作锁定的方法。

如果你在线程化应用中碰到问题,将该程序运行在

src/tools/thread

来查看是否你的平台有线程不安全的函数。这个程序会被

configure

运行,但是对于二进制发布,你的库可能不匹配用来编译二进制的库。

本文转自PostgreSQL中文社区,原文链接:

继续阅读