ManualResetEvent 字典 - ThreadSafety
Dictionary of ManualResetEvent - ThreadSafety
我正在使用 ManualResetEvents 字典同步一些线程。它看起来像这样。我的问题是,像这样调用字典的 getter/indexer 是线程安全的吗? 我应该从锁和存储的上下文中调用 getter局部变量中的值?
枚举类型
enum RecvType
{
Type1,
Type2
//etc...
}
ManualResetEvents 字典
Dictionary<RecvType, ManualResetEvent> recvSync;
等待操作
void WaitForRecv(RecvType recvType, int timeout = 10000)
{
if (!recvSync[recvType].WaitOne(timeout))
{
throw new TimeoutException();
}
// do stuff
}
EventHandler(从另一个线程调用)
void RecvDone(object sender, RecvType recvType)
{
recvSync[recvType].Set();
}
编辑 - 澄清字典人口
字典实例化
public MyClass()
{
recvSync = new Dictionary<RecvType, ManualResetEvent>();
// populate dictionary (not modified after here)
socketWrapper.RecvDone += RecvDone;
}
根据 documentation:
A Dictionary<TKey,TValue>
can support multiple readers concurrently, as long as the collection is not modified.
因此,关于 thread-safety,您的使用模式没有问题。当多个线程读取它时,“冻结”Dictionary<K,V>
的行为定义明确。
您可以考虑使用 ImmutableDictionary<K,V>
instead of a normal Dictionary<K,V>
, but that clarity would come with a cost: Finding an element in an ImmutableDictionary<K,V>
is ~10 times slower.
更清楚地传达您的意图
我正在使用 ManualResetEvents 字典同步一些线程。它看起来像这样。我的问题是,像这样调用字典的 getter/indexer 是线程安全的吗? 我应该从锁和存储的上下文中调用 getter局部变量中的值?
枚举类型
enum RecvType
{
Type1,
Type2
//etc...
}
ManualResetEvents 字典
Dictionary<RecvType, ManualResetEvent> recvSync;
等待操作
void WaitForRecv(RecvType recvType, int timeout = 10000)
{
if (!recvSync[recvType].WaitOne(timeout))
{
throw new TimeoutException();
}
// do stuff
}
EventHandler(从另一个线程调用)
void RecvDone(object sender, RecvType recvType)
{
recvSync[recvType].Set();
}
编辑 - 澄清字典人口
字典实例化
public MyClass()
{
recvSync = new Dictionary<RecvType, ManualResetEvent>();
// populate dictionary (not modified after here)
socketWrapper.RecvDone += RecvDone;
}
根据 documentation:
A
Dictionary<TKey,TValue>
can support multiple readers concurrently, as long as the collection is not modified.
因此,关于 thread-safety,您的使用模式没有问题。当多个线程读取它时,“冻结”Dictionary<K,V>
的行为定义明确。
您可以考虑使用 ImmutableDictionary<K,V>
instead of a normal Dictionary<K,V>
, but that clarity would come with a cost: Finding an element in an ImmutableDictionary<K,V>
is ~10 times slower.