2011-08-25 76 views
12

我正在使用Parallel.Foreach來填充外部ConcurrentBag。我也試着使用一個共同的列表,一切工作正常。ConcurrentBag比List更好嗎?

我很幸運,或者我錯過了ConcurrentBag的特殊範圍?

+0

有多少核心/ CPU的不開發機器有哪些? – ChaosPandion

+0

兩個處理器。 – abx78

回答

18

你很幸運; Parallel.ForEach填充列表不是線程安全的,您最終會遇到問題。

根據MSDN,List<T>不是線程安全的:

所有實例成員不能保證線程安全的。

列表<T>可以同時支持多個閱讀器,只要 集合沒有被修改。枚舉枚舉通過 本質上不是一個線程安全的過程。在枚舉枚舉與一個或多個寫入訪問競爭的罕見情況下, 確保線程安全的唯一方法是在整個枚舉過程中鎖定集合。要允許通過多個 線程訪問該集合以進行讀寫,您必須實現自己的 同步。

ConcurrentBag是你應該使用的,它對多個讀者和作者是線程安全的。

+0

謝謝澄清! – abx78

+0

歡迎你。請將其中一個答案標記爲已接受。謝謝! –

5

如果您使用Parallel.ForEach來填充List<T>,並且一切正常,那麼您只是很幸運。 ForEach方法可以並且將在多線程上運行您的代碼,因此ForEach以外的任何通信都必須使用可處理併發更新的對象。 List<T>不能不ConcurrentBag<T>可以。

+0

這兩個問題都很好,謝謝! – abx78