27.14. 在多線程程序裡的行為

如果在製作 PostgreSQL 發佈的時候,使用了 configure 的命令行參數 --enable-thread-safety, 那麼 libpq 是可重入的並且是線程安全的。另外,在您編譯自己的應用代碼時, 可能需要使用額外的編譯器命令行選項。請參考您的系統的文件獲取有關如何編譯多線程應用的訊息。 或者查閱 src/Makefile.global,找 PTHREAD_CFLAGSPTHREAD_LIBS

一個現實是,兩個線程不能試圖同時操作同一個 PGconn 對象。 特別是,您不能從不同的線程裡透過同一個連接對像發出並發的命令。 (如果您需要執行並行命令,請使用多個連接。)

PGresult對像在建立後是只讀的,因此可以自由地在線程之間傳遞。

過時了的函數 PQoidStatusPQoidStatusfe_setauthsvc 都是線程不安全的, 因此不應該在一個多線程的程序裡面使用。 PQrequestCancel 可以由 PQcancel 代替。 PQoidStatus 可以由 PQoidValue代替。而我們覺得根本沒有調用 fe_setauthsvc 的必要。

libpq 客戶端使用的 crypt 加密方法倚賴 crypt() 系統函數,它通常不是線程安全的。 我們最好使用 MD5 加密,它在所有平台上是線程安全的。

如果您的線程應用有問題,那麼執行一個在 src/tools/thread 裡的程序, 看看您的平台是否有線程安全的函數。這個程序由 configure 執行, 但如果是二進製版本,您的庫可能就不能和製作二進制的那個庫匹配了。