这段代码是线程安全的吗?

Posted

技术标签:

【中文标题】这段代码是线程安全的吗?【英文标题】:Is this code threadsafe? 【发布时间】:2009-02-07 20:18:41 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

关于异常安全:我很惊讶MSDN 教科书上的Mutex 示例甚至不关心通过RAII 引入锁定。这看起来像是倒退了十年。【参考方案2】:

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

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

【讨论】:

以上是关于这段代码是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

+= 运算符在 Python 中是线程安全的吗?

原子增加和比较是线程安全的吗

errno 是线程安全的吗?

当我从 C# 代码调用 C++ 代码时,它是线程安全的吗?

ThreadLocalRandom 是线程安全的吗?

此类使用 AtomicBooleans。它是线程安全的吗?