使用线程安全的.NET 4+集合时是否可能导致死锁?

时间:2013-03-15 17:21:00

标签: c# .net multithreading

System.Collections.Concurrent中的集合在所有情况下都是完全线程安全的吗?或者,从多个线程使用多个并发集合时理论上是否可能导致死锁?

感谢。

2 个答案:

答案 0 :(得分:6)

嗯,有些类型肯定会以导致死锁的方式使用。例如,BlockingCollection.Take阻塞直到一个元素可用,所以如果你在UI线程和一些后台线程上调用它,那么Take的生成项必须通过UI线程同步某些东西(比如说有一个COM)在后台静默编组的依赖关系),你可以陷入僵局。与处理线程一样,即使使用“线程安全”类,也建议采用合理的偏执程度。

答案 1 :(得分:5)

这些类(大多数情况下)是线程安全的,如MSDN上所述。例如,documentation for ConcurrentQueue<T>明确指出:

  

ConcurrentQueue的所有公共成员和受保护成员都是线程安全的,可以从多个线程同时使用。

所有必需的同步都在内部处理。

另请注意,某些类型存在一些小的线程安全问题,例如BlockingCollection<T>.Dispose(),这不是线程安全的,但是again documented on MSDN

  

Dispose方法不是线程安全的。 BlockingCollection的所有其他公共成员和受保护成员都是线程安全的,可以从多个线程同时使用。

话虽这么说,如果你正在进行自己的同步,你可能会导致与这些类型的使用无关的死锁。如果您遇到死锁,很可能是由于您的代码或您正在使用的库中的其他同步造成的。