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

2 回答 2

4

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

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

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

于 2009-02-07T20:23:59.230 回答
3

如果您在进程中使用线程并且只想互斥,请使用 Monitor 而不是 Mutex - 我相信它更有效。

这看起来不错 - 但您在读取值时也应该锁定,否则没有什么可以说它不会过时。另一种方法是使变量 volatile(至少在 C# 中 - 我不知道 C++/CLI 中的等价物是什么。)

于 2009-02-07T20:22:59.030 回答