这段代码是线程安全的吗?
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 中的等价物是什么。)
【讨论】:
以上是关于这段代码是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章