2009-02-07 137 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中的等价物是什么)。