加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 这是多线程方法中Dictionary的安全使用吗?

发布时间:2020-12-15 22:16:35 所属栏目:百科 来源:网络整理
导读:我有一个项目集合(SortedPoints),我使用Parallel.ForEach迭代.每个项目都将成为名为Stripes的词典中的键.计算每个项目的价值是昂贵的,并且在BulidStripes方法中. Parallel.ForEach(SortedPoints,point = Stripes[point] = BuildStripes(point,pointToPositio
我有一个项目集合(SortedPoints),我使用Parallel.ForEach迭代.每个项目都将成为名为Stripes的词典中的键.计算每个项目的价值是昂贵的,并且在BulidStripes方法中.

Parallel.ForEach(SortedPoints,point =>
    Stripes[point] = BuildStripes(point,pointToPosition)
);

我可以使Stripes成为ConcurrentDictionary,但我想知道这是否可行:

1)使条纹成为常规字典.

2)连续迭代所有点,并使用映射填充Stripes到空对象.

3)并行迭代所有点,并将Stripes中的映射替换为BuildStripes返回的实际值.

foreach(var point in SortedPoints)
    Stripes[point] = emptyStripe;
Parallel.ForEach(SortedPoints,pointToPosition)
);

如果每个线程在一组单独的键上工作并且每个键按照我概述的顺序预先加载到Dictionary中,那么是设置键线程安全的值吗?我查看了Dictionary的源代码并且它看起来很安全,但是这些集合是微妙的动物并且很难发现并行错误.

创建字典后,我再也不会修改它,所有访问都是读取.

解决方法

让我们看看事实.在以下情况下可能发生线程错误

>添加新项目?不
>在添加项目时调整字典大小.这不是问题,你的字典有一个固定的大小.
>两个线程尝试设置相同键的值.不会发生,因为您的SortedPoints集合具有不同的项目(是吗?)

还有其他选择吗?我没有看到一个.我认为你可以放心使用这种方法.

但是当然只需使用常规的ConcurrentDictionnary来获取可读性!也许你可以获得一些性能,但除非你对它进行基准测试,否则没有理由不使用ConcurrentDictionary.

Some docs about what ConcurrentDictionary deal with.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读