我正在使用Parallel.Foreach來填充外部ConcurrentBag。我也試着使用一個共同的列表,一切工作正常。ConcurrentBag比List更好嗎?
我很幸運,或者我錯過了ConcurrentBag的特殊範圍?
我正在使用Parallel.Foreach來填充外部ConcurrentBag。我也試着使用一個共同的列表,一切工作正常。ConcurrentBag比List更好嗎?
我很幸運,或者我錯過了ConcurrentBag的特殊範圍?
你很幸運; Parallel.ForEach
填充列表不是線程安全的,您最終會遇到問題。
根據MSDN,List<T>
不是線程安全的:
所有實例成員不能保證線程安全的。
列表<T>可以同時支持多個閱讀器,只要 集合沒有被修改。枚舉枚舉通過 本質上不是一個線程安全的過程。在枚舉枚舉與一個或多個寫入訪問競爭的罕見情況下, 確保線程安全的唯一方法是在整個枚舉過程中鎖定集合。要允許通過多個 線程訪問該集合以進行讀寫,您必須實現自己的 同步。
ConcurrentBag是你應該使用的,它對多個讀者和作者是線程安全的。
謝謝澄清! – abx78
歡迎你。請將其中一個答案標記爲已接受。謝謝! –
如果您使用Parallel.ForEach
來填充List<T>
,並且一切正常,那麼您只是很幸運。 ForEach
方法可以並且將在多線程上運行您的代碼,因此ForEach
以外的任何通信都必須使用可處理併發更新的對象。 List<T>
不能不ConcurrentBag<T>
可以。
這兩個問題都很好,謝謝! – abx78
ConcurrentBag是正確的答案,只有在.NET 4.0中它非常慢。這已在.NET 4.5中修復。見http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0
兩個ConcurrentStack和ConcurrentQueue也將在你的情況下工作......
有多少核心/ CPU的不開發機器有哪些? – ChaosPandion
兩個處理器。 – abx78