首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HashTable并发

HashTable并发
EN

Stack Overflow用户
提问于 2012-01-30 07:56:04
回答 2查看 1.1K关注 0票数 2

我有一个由多个线程访问的HashTable。例如,让我们看看三个线程:

线程A执行Hash.Insert("a",新对象());

线程B执行Hash.Insert("b",新对象());

线程C执行Hash.Insert("a",新对象());

出于某些原因,我不能在整个哈希上使用锁

我不关心顺序,也不关心进程结束时哪个对象会在散列中。我唯一关心的是不要通过从不同线程更新相同的单元格来获取数据损坏。

我有什么选择?或者这不是一个问题,HashTable自己处理,并保持数据的触觉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-30 08:05:28

您可以考虑使用这样的方法:

代码语言:javascript
运行
复制
ConcurrentDictionary<string, object> Hash = new ConcurrentDictionary<string, object>();

来自System.Collections.Concurrent命名空间。

票数 5
EN

Stack Overflow用户

发布于 2012-01-30 22:50:11

ConcurrentDictionary应该为你工作。它不是免费锁定的,但它不会“锁定整个散列”,除非在某些情况下。

它使用两个集合,一个锁数组和一个哈希桶集合。

锁桶的数量可以通过设置并发级别来控制,哈希桶的初始数量可以通过设置初始容量来控制。(这两个都是构造函数参数)。

锁数组中的每个桶使用一个简单的模块哈希来覆盖几个(至少一个真正的)哈希桶。

并发字典锁定所有锁桶的唯一时间是:

当调整散列桶大小时,

  1. 。读取公共密钥属性时的
  2. 。读取“公共值”属性时的Property.
  3. When
  4. ,读取“公共计数”属性时的“
  5. ”,读取“调用公共值”的“公共值”属性时的“
  6. ”。

除了调整大小之外,所有这些都很容易避免。

如果可以预测字典中的最大项数,则可以避免调整大小。

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

https://stackoverflow.com/questions/9060871

复制
相关文章

相似问题

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