33.19. 線上程化程式中的行為
libpq預設是可再入的并且是線程安全的。你可能需要使用特殊的編譯器指令行選項來編譯你的應用代碼。參考你的系統文檔來了解如何編譯啟用線程的應用,或者在
src/Makefile.global
中查找
PTHREAD_CFLAGS
和
PTHREAD_LIBS
。這個函數允許查詢libpq的線程安全狀态:
一個線程限制是不允許兩個線程同時嘗試操縱同一個
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中文社群,原文連結: