PostgreSQL 在線程化程序中的行為

2021-09-02 13:47 更新

libpq默認(rèn)是可再入的并且是線程安全的。你可能需要使用特殊的編譯器命令行選項(xiàng)來編譯你的應(yīng)用代碼。參考你的系統(tǒng)文檔來了解如何編譯啟用線程的應(yīng)用,或者在src/Makefile.global中查找PTHREAD_CFLAGSPTHREAD_LIBS。這個(gè)函數(shù)允許查詢 libpq的線程安全狀態(tài):

PQisthreadsafe

返回libpq庫的線程安全狀態(tài)。

int PQisthreadsafe();

如果libpq是線程安全的則返回 1,否則返回 0。

一個(gè)線程限制是不允許兩個(gè)線程同時(shí)嘗試操縱同一個(gè)PGconn對(duì)象。特別是你不能從不同的線程通過同一個(gè)連接對(duì)象發(fā)出并發(fā)的命令(如果你需要運(yùn)行并發(fā)命令,請(qǐng)使用多個(gè)連接)。

PGresult對(duì)象在創(chuàng)建后通常是只讀的,并且因此可以在線程之間自由地被傳遞。但是,如果你使用任何第 33.11 節(jié)第 33.13 節(jié)中描述的 PGresult修改函數(shù),你需要負(fù)責(zé)避免在同一個(gè)PGresult上的并發(fā)操作。

被廢棄的函數(shù)PQrequestCancel以及PQoidStatus不是線程安全的并且不應(yīng)當(dāng)在多線程程序中使用。 PQrequestCancel可以被替換為PQcancel。 PQoidStatus 可以被替換為PQoidValue。

如果你在應(yīng)用中使用 Kerberos (除了在libpq中之外),你將需要對(duì) Kerberos 調(diào)用加鎖,因?yàn)?Kerberos 函數(shù)不是線程安全的。參考libpq源代碼中的PQregisterThreadLock函數(shù),那里有在libpq和應(yīng)用之間做合作鎖定的方法。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)