System.Collections.Concurrent 中的集合在所有情况下都是完全线程安全的吗?或者在使用来自多个线程的多个并发集合时理论上可能导致死锁?
谢谢。
System.Collections.Concurrent 中的集合在所有情况下都是完全线程安全的吗?或者在使用来自多个线程的多个并发集合时理论上可能导致死锁?
谢谢。
好吧,某些类型当然可以以导致死锁的方式使用。例如,BlockingCollection.Take阻塞直到一个元素可用,所以如果你在 UI 线程和一些后台线程上调用它,Take 的生成项目最终不得不通过 UI 线程同步某些东西(比如有一个 COM 依赖项在后台默默地编组),你可以死锁。与处理线程一样,即使使用“线程安全”类,也建议保持合理的偏执程度。
如 MSDN 中所述,这些类(大部分)是线程安全的。例如,文档ConcurrentQueue<T>
明确指出:
ConcurrentQueue 的所有公共和受保护成员都是线程安全的,并且可以从多个线程同时使用。
所有需要的同步都在内部处理。
另请注意,某些类型有一些较小的线程安全问题,例如BlockingCollection<T>.Dispose()
,它不是线程安全的,但在 MSDN 上再次记录:
Dispose 方法不是线程安全的。BlockingCollection 的所有其他公共和受保护成员都是线程安全的,并且可以从多个线程同时使用。
话虽如此,如果您自己进行同步,则可能会导致与这些类型的使用无关的死锁。如果您遇到死锁,很可能是由于您的代码或您正在使用的库中的其他一些同步。