2009-02-07 114 views
3

我正在寫一些代碼,UI線程需要與後臺線程進行網絡通信。該代碼有效,但它會被認爲是線程安全的?這段代碼是否是線程安全的?

我就感覺好多了,如果有人經歷可能導致我到這個正確的道路......

static Mutex^ mut_currentPage = gcnew Mutex; 
static array<unsigned char>^ m_currentPage; 

property array<unsigned char>^ Write 
{ 
    void set(array<unsigned char>^ value) 
    { 
     mut_currentPage->WaitOne(); 
     m_currentPage = value; 
     mut_currentPage->ReleaseMutex(); 
    } 
} 

這是.NET的C++代碼... :)

回答

4

它看起來是線程安全的,但您可能想要考慮異常處理;設置一個字段不應該是錯誤的(除了可能是ThreadAbortException),但是如果代碼更復雜,你會希望確保在異常時釋放互斥鎖。

我也想看看Monitor(在C#中「鎖定」)

另外一個想法:即使您鎖定字段訪問,數組本質上是可變的。考慮使用string,因爲這是不可變的?

+0

關於異常安全性:我真的很驚訝MSDN的Mutex教科書示例甚至不關心通過RAII引入鎖定。這看起來像是倒退了十年。 – gimpf 2009-02-07 20:28:26

3

如果您'在流程中使用線程,你只需要互斥,使用Monitor而不是Mutex - 我相信它更高效。

這看起來沒問題 - 但你也應該鎖定讀取的值,或者沒有什麼可說的,它不會陳舊。另一種方法是使變量volatile(至少在C#中 - 我不知道C++/CLI中的等價物是什麼)。