2010-05-07 44 views
0

我正在編寫一個多線程應用程序。我的工作線程從環境對象獲取連接,如下所示:我應該把臨界區從OCCI環境中取得連接

//EnterCriticalSection(&cs); 
conn = env->createConnection(username, password, connStr); 
//LeaveCriticalSection(&cs); 

併發,如果連接在一個臨界區創建或不? env是否需要它?爲什麼?

謝謝。

回答

2

如果createConnection是線程安全的,那麼你不需要它。

如果createConnection不是線程安全的,那麼您確實需要關鍵部分。

請查閱您的文檔以查看它是否是線程安全的。如果它沒有明確地說它是線程安全的,那麼它們就會安全地運行並將其包含在關鍵部分中。

編輯:當然,以上全部假設多個線程將呼叫createConnection。如果他們不是,那麼顯然你根本不需要關鍵部分。

+0

它說如果在THREADED_MUTEXED模式下創建環境,它就是線程安全的。但是,一段時間後,線程在創建連接時被鎖定。 http://www.youngcow.net/doc/oracle10g/appdev.102/b14294/reference014.htm – Feyyaz 2010-05-07 12:13:44

+1

我對這些文檔的閱讀是,如果使用了'THREADED_MUTEXED',對'createEnvironment()'的調用是線程安全的。然而,關於'createConnection'是線程安全的。如果遇到問題,當您在關鍵部分中包裝'createConnection'時,它們會消失,那麼您應該保留關鍵部分。 – Glen 2010-05-07 12:24:55

+0

我在大約3個小時內運行了關鍵部分的應用程序,到目前爲止沒有發生任何問題。不過,我仍然懷疑它的運行速度比沒有關鍵部分的運行慢得多。另外我想這並不意味着它是線程安全的,因爲它在測試時不會被鎖定。我對嗎? – Feyyaz 2010-05-07 13:48:41