首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManualResetEvent - ThreadSafety词典

ManualResetEvent - ThreadSafety词典
EN

Stack Overflow用户
提问于 2022-02-15 16:15:57
回答 1查看 58关注 0票数 1

我正在使用ManualResetEvents字典同步一些线程。看上去像这样。我的问题是,像这样调用字典的getter/indexer是否线程安全?应该从锁的上下文调用getter并将值存储在局部变量中吗?

Enum型

代码语言:javascript
复制
enum RecvType
{
    Type1,
    Type2
    //etc...
}

ManualResetEvents字典

代码语言:javascript
复制
Dictionary<RecvType, ManualResetEvent> recvSync;

等待操作

代码语言:javascript
复制
 void WaitForRecv(RecvType recvType, int timeout = 10000)
 {
    if (!recvSync[recvType].WaitOne(timeout))
    {
        throw new TimeoutException();
    }
        
    // do stuff
 }

EventHandler (从另一个线程调用)

代码语言:javascript
复制
void RecvDone(object sender, RecvType recvType)
{
    recvSync[recvType].Set();
}

编辑-澄清字典总数

字典索引

代码语言:javascript
复制
public MyClass()
{
    recvSync = new Dictionary<RecvType, ManualResetEvent>();
    // populate dictionary (not modified after here)
    socketWrapper.RecvDone += RecvDone;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 18:24:12

根据文档

只要集合不被修改,Dictionary<TKey,TValue>可以同时支持多个读取器。

因此,您的使用模式是可以的,关于线程安全。当多个线程正在读取“冻结”Dictionary<K,V>的行为时,定义得很好。

您可以考虑通过使用ImmutableDictionary而不是普通的Dictionary<K,V>来更清楚地表达您的意图,但是这种清晰需要付出代价:在ImmutableDictionary<K,V>中查找元素是~10倍

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71129813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档