繁体   English   中英

标准线程安全.Net字典

[英]Standard Thread safe .Net Dictionary

MSDN指出,更改对.NET Dictionary<K,V>类型的访问权限不是线程安全的。 有标准的线程安全版本吗?

注意: “没有就没有”是正确的答案。 在那种情况下(看来是这样),我会去做锁事情。


几乎重复

在.NET中实现线程安全字典的最佳方法是什么? (不完全是因为我想要一个标准类型,而不是我实现自己的东西)

没有。 考虑一下此代码,其中每个方法/属性都是线程安全的

if (!SFdict.Contains(key))
{
   SFdict[key] = value;
}

尽管每个动作都可能是线程安全的,但是代码块具有竞争条件,b / c有两个方法调用和两个不同的关键部分。 唯一的方法是手工

lock(lck)
{
   if (!dict.Contains(key))
   {
      dict[key] = value;
   }
}

尽管Hashtable不是通用的,但只要您正确使用它(一个写入器,多个读取器,没有枚举),它就具有线程安全性。

线程安全

为了支持一个或多个编写器,必须通过Synchronized方法返回的包装器对Hashtable进行所有操作。

通过集合进行枚举本质上不是线程安全的过程。 即使同步了一个集合,其他线程仍然可以修改该集合,这将导致枚举器引发异常。 为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程进行的更改导致的异常。

但是它与Dictionary<K, V>有所不同-如果您尝试获取不存在的值,它将返回null ,而不抛出KeyNotFoundException (因此存储null值可能会出现问题)。 如果您知道尝试添加新密钥的线程永远不会超过一个,并且可以处理null问题,那么这是一个非常有用的集合。

.NET 4.0现在具有ConcurrentDictionary<K,T>类,该类似乎可以满足您的要求。 也在.NET 4.5中

除了重复问题的答案外,您可能还想看一下使用ReaderWriterSlim实现 ReaderWriterSlim应该比简单的锁定(有效使用Monitor )提供一些性能上的好处-一定要看看。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM