4

许多线程可以访问summary. 每个线程都有一个访问字典的唯一键;

Dictionary<string, List<Result>> summary;

我需要锁定以下操作吗?

  1. summary[key] = new List<Result>()
  2. summary[key].Add(new Result());

似乎我不需要锁定,因为每个线程都会使用不同的键访问字典,但是(1)不会因为将新记录与其他线程同时添加到字典而出现问题吗?

4

3 回答 3

5

是的,您需要使用锁定。

字典对于添加操作不是线程安全的。如果您使用的是 .NET 4,则可以考虑切换到ConcurrentDictionary。否则,您应该创建自己的线程安全集合(例如this)。

考虑使用ReaderWriterLockSlim来同步对您的集合的访问(以防您不使用 ConcurrentDictionary)。

于 2012-06-17T15:13:45.537 回答
2

必须锁定对您的字典的所有写访问。不能保证访问不同的键是线程安全的,事实上,它不是。

来自MSDN

只要不修改集合,字典就可以同时支持多个阅读器。即便如此,通过集合枚举本质上不是线程安全的过程。在枚举与写访问竞争的极少数情况下,必须在整个枚举期间锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

于 2012-06-17T15:14:23.490 回答
0

默认情况下,字典不是线程安全的。你要添加什么并不重要。最重要的是:您无法控制来自不同线程的并发添加。所以你肯定需要锁。或者切换到线程安全集合(即 CocnurrentDictionary for .NET 4+)

于 2012-06-17T15:17:58.573 回答