哈希表并发

发布于 2025-01-01 04:04:42 字数 333 浏览 0 评论 0原文

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

线程 A 执行 Hash.Insert("a",new object());

线程 B 执行 Hash.Insert("b",new object());

线程 C 执行 Hash.Insert("a",new object());

由于某些原因,我无法在整个哈希上使用锁

我不关心顺序或进程结束时哪个对象将位于哈希中。我唯一关心的是不要通过从不同线程更新同一单元来导致数据损坏。

我有什么选择?或者这不是一个问题,哈希表会自行处理该问题并保持数据完好无损。

I have a HashTable which is accessed by multiple threads. For example lets look at three threads:

Thread A does Hash.Insert("a",new object());

Thread B does Hash.Insert("b",new object());

Thread C does Hash.Insert("a",new object());

For some reasons, I cannot use a Lock on the entire Hash

I dont care about the order or which object will be at the hash at the end of the process. The only thing I care about is not getting data corruption by updating the same cell from different threads.

What are my options? or is it not a problem and the HashTable handles that by itself and keeps the data in tact.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

絕版丫頭 2025-01-08 04:04:42

您可以考虑使用类似的内容:

ConcurrentDictionary<string, object> Hash = new ConcurrentDictionary<string, object>();

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

You could consider using something like:

ConcurrentDictionary<string, object> Hash = new ConcurrentDictionary<string, object>();

from the System.Collections.Concurrent namespace.

彩扇题诗 2025-01-08 04:04:42

ConcurrentDictionary 应该适合你。它不是无锁的,但它不会“锁定整个哈希”,除非在某些情况下。

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

锁数组中的每个桶使用简单的模哈希覆盖多个(实际上至少一个)哈希桶。

并发字典锁定所有锁桶的唯一情况是:

  1. 调整哈希桶大小时。
  2. 读取 public Keys 属性时。
  3. 当阅读公共价值观财产时。
  4. 当读取公共计数属性时。
  5. 当读取公共 IsEmpty 属性时。
  6. 当调用 Clear() 时。
  7. 序列化时。

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

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

ConcurrentDictionary should work for you. It is not lock free, but it does not "lock the entire hash" except in certain situations.

It uses two collections, a lock array and a collection of hash buckets.
The number of lock buckets can be controlled by setting the concurrency level, and the initial number of hash buckets can be controlled by setting the initial capacity. (these are both constructor parameters).

Each bucket in the lock array covers several (well at least one really) hash buckets using a simple modulo hash.

The only times that the concurrent dictionary locks all the lock buckets are:

  1. When resizing the the hash buckets.
  2. When reading the public Keys property.
  3. When reading the public Values Property.
  4. When Reading the public Count Property.
  5. When reading the public IsEmpty Property.
  6. When Calling Clear().
  7. When serializing.

With the exception of resizing these are all easily avoidable.

Resizing can be avoided if you can predict the max number of items in the dictionary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文