2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

32.21. 多執行緒程式中的行為 #

從版本 17 開始,libpq 始終是可重入和執行緒安全的。但是,有一項限制是,任何兩個執行緒不能同時操作同一個 PGconn 物件。特別是,您不能透過同一個連線物件從不同的執行緒發出併發命令。(如果您需要執行併發命令,請使用多個連線。)

PGresult 物件在建立後通常是隻讀的,因此可以自由地線上程之間傳遞。libpq 但是,如果您使用第 32.12 節第 32.14 節中描述的任何 PGresult 修改函式,那麼您也需要自己避免對同一個 PGresult 進行併發操作。

在早期版本中,libpq 可以根據編譯器選項選擇是否支援執行緒。此函式允許查詢 libpq 的執行緒安全狀態

PQisthreadsafe #

返回 libpq 庫的執行緒安全狀態。

int PQisthreadsafe();

如果 libpq 是執行緒安全的,則返回 1,如果不是,則返回 0。對於版本 17 及以上版本,始終返回 1。

已棄用的函式 PQrequestCancelPQoidStatus 不是執行緒安全的,不應在多執行緒程式中使用。PQrequestCancel 可以被 PQcancelBlocking 替換。PQoidStatus 可以被 PQoidValue 替換。

如果您在應用程式中使用 Kerberos(除了在 libpq 內部使用),您將需要圍繞 Kerberos 呼叫進行鎖定,因為 Kerberos 函式不是執行緒安全的。有關在 libpq 和您的應用程式之間進行協作鎖定的方法,請參閱 libpq 原始碼中的 PQregisterThreadLock 函式。

同樣,如果您在應用程式中使用 Curl,並且您在啟動新執行緒之前沒有全域性初始化 libcurl,那麼您將需要圍繞任何可能初始化 libcurl 的程式碼進行協作鎖定(同樣透過 PQregisterThreadLock)。對於構建為支援執行緒安全初始化的較新版本的 Curl,此限制已解除;這些構建可以透過其版本元資料中對 threadsafe 功能的宣告來識別。

提交更正

如果您在文件中看到任何不正確的內容,與您在使用特定功能時的體驗不符,或者需要進一步的解釋,請使用 此表單 報告文件問題。