PostgreSQL10.1手冊_部分IV.客戶端介面_第33章libpq-C庫_33.19.線上程化程式中的行為

李博bluemind發表於2018-10-03

33.19. 線上程化程式中的行為

libpq預設是可再入的並且是執行緒安全的。你可能需要使用特殊的編譯器命令列選項來編譯你的應用程式碼。參考你的系統文件來了解如何編譯啟用執行緒的應用,或者在src/Makefile.global中查詢PTHREAD_CFLAGSPTHREAD_LIBS。這個函式允許查詢libpq的執行緒安全狀態:

PQisthreadsafe

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

int PQisthreadsafe();

如果libpq是執行緒安全的則返回 1,否則返回 0。

一個執行緒限制是不允許兩個執行緒同時嘗試操縱同一個PGconn物件。特別是你不能從不同的執行緒通過同一個連線物件發出併發的命令(如果你需要執行併發命令,請使用多個連線)。

PGresult物件在建立後通常是隻讀的,並且因此可以線上程之間自由地被傳遞。但是,如果你使用任何第 33.11 節第 33.13 節中描述的PGresult修改函式,你需要負責避免在同一個PGresult上的併發操作。

被廢棄的函式PQrequestCancel以及PQoidStatus不時執行緒安全的並且不應當在多執行緒程式中使用。PQrequestCancel可以被替換為PQcancelPQoidStatus可以被替換為PQoidValue

如果你在應用中使用 Kerberos (除了在libpq中之外),你將需要對 Kerberos 呼叫加鎖,因為 Kerberos 函式不是執行緒安全的。參考libpq原始碼中的PQregisterThreadLock函式,那裡有在libpq和應用之間做合作鎖定的方法。

如果你線上程化應用中碰到問題,將該程式執行在src/tools/thread來檢視是否你的平臺有執行緒不安全的函式。這個程式會被configure執行,但是對於二進位制釋出,你的庫可能不匹配用來編譯二進位制的庫。

本文轉自PostgreSQL中文社群,原文連結:33.19. 線上程化程式中的行為


相關文章