2017-08-24 61 views
2

我有一個單線程環境以下過程:等效陣列的

int[] ages = { 40, 30, 18, 23, 60, 24 }; 
for (int i = 0; i < ages.Length; i++) 
{ 
    if (ages[i] < 21) ages[i] = 0; 
} 

作爲一個例子,但現在我想這樣做的過程中多線程環境。 是否有一個Concurrent集合在多線程環境中模擬數組?

+1

'ConcurrentBag '也許 – r1verside

+1

不太,ConcurrentBag並不意味着保持索引排序。但請注意,這些代碼可以並行處理,而不會輕易與ParallelFor衝突。 – Miguel

+1

ConcurrentBag 不允許按索引訪問密鑰,這是我想要實現的。 –

回答

2

最接近的解決方案是使用使用索引作爲關鍵字的ConcurrentDictionary。哈希函數將是非常好的在這種情況下:

var dict = new ConcurrentDictionary<int, int>(Enumerable.Range(0, ages.Length).ToDictionary(i => i, i => ages[i])); 
Parallel.For(0, dict.Count, 
    i => 
    { 
     int value; 
     if (dict.TryGetValue(i, out value) && value < 21) 
      dict.TryUpdate(i, value, 0); 
    }); 

注重的事實,這個特殊的例子並不需要,因爲你必須每次迭代之間不存在依賴關係使用ConcurrentDictionary可言。

Parallel.For(0, ages.Length, 
    i => 
    { 
     if (ages[i] < 21) ages[i] = 0; 
    }); 

此代碼將完美適用於您的示例。下一次使用更復雜的東西,比如數組元素的總和。

希望得到這個幫助!

3

您可以嘗試使用並行LINQPLINQ),並讓淨兌現最終結果作爲數組;你的情況:

int[] ages = { 40, 30, 18, 23, 60, 24 }; 

ages = ages 
    .AsParallel() 
    .Select(age => age < 21 ? 0 : age) 
    .ToArray(); 

PLINQ的優點是,.NET是resposnsible對裏面的收藏選擇,鎖等,如果你想,說,找到並行的平均年齡所有你需要做的就是稍微修改查詢:

var averageAge = ages 
    .AsParallel() 
    .Average();