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.

更清楚地传达您的意图