标准线程安全.Net字典

时间:2009-05-08 22:44:35

标签: .net multithreading dictionary

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

注意:“没有”是有效答案,如果是真的话。在那种情况下(似乎是),我会去做锁定的事情。


几乎重复

What’s the best way of implementing a thread-safe Dictionary in .NET?(不完全是因为我想要一个标准类型,而不是我实现自己的东西)

4 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

虽然Hashtable不是通用的,但只要你正确使用它(一个作者,多个读者,没有枚举),它就是线程安全的。

  

线程安全

     

支持一个或多个作家,全部   Hashtable上的操作必须是   通过返回的包装器完成   同步方法。

     

通过集合枚举是   本质上不是线程安全的   程序。即使是收藏品   同步,其他线程可以   仍然修改集合,其中   导致枚举器抛出一个   例外。保证线程安全   在枚举期间,您可以   在整个过程中锁定集合   枚举或捕获异常   由其他人做出的改变   线程。

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

答案 2 :(得分:2)

.NET 4.0现在有一个ConcurrentDictionary<K,T>类似乎可以做你想要的。 Also in .NET 4.5

答案 3 :(得分:1)

除了重复问题的答案之外,您可能需要查看this implementation that uses ReaderWriterSlimReaderWriterSlim实际上应该比简单锁定(有效地使用Monitor)提供一些性能优势 - 绝对可以看看。