【问题标题】:Minimal-locking thread-safe hashtable?最小锁定线程安全哈希表?
【发布时间】:2010-01-21 16:47:31
【问题描述】:

在 .NET 中是否有任何可用的 Hashtable 实现以最少的锁定提供线程安全?还是可以移植到 .NET 的另一种语言?

我们正在寻找介于使用带有 lock() 的 BCL Dictionary 类和 memcached 或 Velocity 等分布式缓存应用程序之间的东西。

预期用途是用于具有数千个读取器的缓存,它们根据键(数字或 guid,我们尚未决定哪个)读取不可变的值。作家会少得多,可能只有一个。

【问题讨论】:

  • 请定义“线程安全”的含义。参看。 blogs.msdn.com/ericlippert/archive/2009/10/19/…
  • 描述您的使用场景也可能会有所帮助。您是要混合插入/查找/删除,还是要以某种方式将它们组合在一起?是要从多个线程访问所有操作,还是只访问某些线程?

标签: c# .net multithreading data-structures locking


【解决方案1】:

从 .Net 4.0 开始有 ConcurrentDictionary。这是一种哈希表样式结构,用于在多个线程之间进行高性能使用。

关于它的使用和实现的细节可以在这里找到:

【讨论】:

  • 这看起来不像是可以通过键索引的;即,没有O(1) 方法可以获取特定的键控值。 ConcurrentBag 似乎对生产者/消费者场景更有用。也许你的意思是ConcurrentDictionary<TKey, TValue> (msdn.microsoft.com/en-us/library/dd287191(VS.100).aspx)?
  • 你的意思是 ConcurrentDictionary 吗? msdn.microsoft.com/en-us/library/dd287191(VS.100).aspx
  • @Jason,@Michael 谢谢,是的,我的意思是 ConcurrentDictionary。我最好的借口是时间还早,我还没喝咖啡就开始了。
  • MSDN 文档只是说它提供了一个线程安全字典,但没有详细说明它是如何实现线程安全的。你有更多细节的链接吗?它是否比旧的同步哈希表实现更好?
  • @Sam,我添加了一个包含更多信息的链接
【解决方案2】:

【讨论】:

  • 基于 ReaderWriterLockSlim 的字典看起来正是我所要求的——更有效的锁定。直接链接:devplanet.com/blogs/brianr/archive/2008/09/26/… Synchronized Hashtable 正是我试图避免的,所有访问都使用简单的 lock()。
  • 你会使用它还是等待 .Net 4 ConcurrentDictionary?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多