System.Collections.Concurrent中的集合在所有情况下都是完全线程安全的吗?或者,从多个线程使用多个并发集合时理论上是否可能导致死锁?
感谢。
答案 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的所有其他公共成员和受保护成员都是线程安全的,可以从多个线程同时使用。
话虽这么说,如果你正在进行自己的同步,你可能会导致与这些类型的使用无关的死锁。如果您遇到死锁,很可能是由于您的代码或您正在使用的库中的其他同步造成的。