这段代码线程安全吗?

时间:2009-02-07 20:18:41

标签: .net c++ multithreading thread-safety

我正在编写一些代码,其中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 ++代码......:)

2 个答案:

答案 0 :(得分:4)

它看起来是线程安全的,但您可能想要考虑异常处理;设置一个字段不应该是错误(可能ThreadAbortException除外),但如果代码更复杂,你需要确保在异常时释放互斥锁。

我还会看Monitor(C#中的“锁定”)

另一个想法:即使您锁定了字段访问权限,数组本质上也是可变的。请考虑使用string,因为这是不可变的?

答案 1 :(得分:3)

如果你在一个进程中使用线程并且你只想要互斥,那么使用Monitor而不是Mutex - 我相信它会更有效率。

看起来没问题 - 但是你也应该在读取值时锁定,或者说没有什么可以说它不会陈旧。另一种方法是使变量变为volatile(至少在C#中 - 我不知道C ++ / CLI中的等价物是什么。)