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

Sof*_*tor 3 .net c# multithreading

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

谢谢.

Dan*_*ant 6

好吧,有些类型肯定会以导致死锁的方式使用.例如,BlockingCollection.Take阻塞直到一个元素可用,所以如果你在UI线程和一些后台线程上调用它,那么Take的生成项必须通过UI线程同步某些内容(比如说有一个COM依赖项,警察默默地在后台),你可以僵局.与处理线程一样,即使使用"线程安全"类,也建议采用合理的偏执程度.


Ree*_*sey 5

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

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

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

另请注意,某些类型有一些小的线程安全问题,例如BlockingCollection<T>.Dispose(),这不是线程安全的,但在MSDN上再次记录:

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

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