從版本 17 開始,libpq 始終是可重入和執行緒安全的。但是,有一項限制是,任何兩個執行緒不能同時操作同一個 PGconn
物件。特別是,您不能透過同一個連線物件從不同的執行緒發出併發命令。(如果您需要執行併發命令,請使用多個連線。)
PGresult
物件在建立後通常是隻讀的,因此可以自由地線上程之間傳遞。libpq 但是,如果您使用第 32.12 節或第 32.14 節中描述的任何 PGresult
修改函式,那麼您也需要自己避免對同一個 PGresult
進行併發操作。
在早期版本中,libpq 可以根據編譯器選項選擇是否支援執行緒。此函式允許查詢 libpq 的執行緒安全狀態
PQisthreadsafe
#返回 libpq 庫的執行緒安全狀態。
int PQisthreadsafe();
如果 libpq 是執行緒安全的,則返回 1,如果不是,則返回 0。對於版本 17 及以上版本,始終返回 1。
已棄用的函式 PQrequestCancel
和 PQoidStatus
不是執行緒安全的,不應在多執行緒程式中使用。PQrequestCancel
可以被 PQcancelBlocking
替換。PQoidStatus
可以被 PQoidValue
替換。
如果您在應用程式中使用 Kerberos(除了在 libpq 內部使用),您將需要圍繞 Kerberos 呼叫進行鎖定,因為 Kerberos 函式不是執行緒安全的。有關在 libpq 和您的應用程式之間進行協作鎖定的方法,請參閱 libpq 原始碼中的 PQregisterThreadLock
函式。
同樣,如果您在應用程式中使用 Curl,並且您在啟動新執行緒之前沒有全域性初始化 libcurl,那麼您將需要圍繞任何可能初始化 libcurl 的程式碼進行協作鎖定(同樣透過 PQregisterThreadLock
)。對於構建為支援執行緒安全初始化的較新版本的 Curl,此限制已解除;這些構建可以透過其版本元資料中對 threadsafe
功能的宣告來識別。
如果您在文件中看到任何不正確的內容,與您在使用特定功能時的體驗不符,或者需要進一步的解釋,請使用 此表單 報告文件問題。