我有一个相当简单的例子,两个线程与同一个数据结构交互。线程托管在它们自己负责的类中。假设这些是 Alfons 类和 Belzebub 类:
class Alfons {
public Mutex listMutex = new Mutex();
private void ProcessListInfo()
{
listMutex.WaitOne();
//
// ... Process multi-access list stuff ...
//
listMutex.ReleaseMutex();
}
}
class Belzebub {
private Alfons mCachedAlfonsReference;
private void ProcessListInfoDifferently()
{
mCachedAlfonsReference.listMutex.WaitOne();
//
// ... Process multi-access list stuff in a different fashion ...
//
mCachedAlfonsReference.listMutex.ReleaseMutex();
}
}
我的问题是,像这样引用 Mutex 是否会造成并发问题,或者是否建议这样做。是否有更好的方法来执行此操作?例如,我是否应该缓存互斥锁引用而不是通过引用访问它。
最佳答案
不会有并发问题 - 互斥锁应该是共享的。根据 Mutex MSDN docs
This type is thread safe.
但是,我会说数据结构本身应该同步来自不同线程的访问。如果数据结构不支持此功能(例如,使用 SyncRoot
),请封装它并添加该功能。
出于好奇:您使用的是哪种数据结构?您可以考虑使用 System.Collections.Concurrent 之一无锁/细粒度锁定解决方案的集合。另外,不会使用 lock
keyword让您的场景更简单、更不容易出错?
关于C# 通过引用互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257058/