天天看點

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中文社群,原文連結:

繼續閱讀