我有一個單線程環境以下過程:等效陣列的
int[] ages = { 40, 30, 18, 23, 60, 24 };
for (int i = 0; i < ages.Length; i++)
{
if (ages[i] < 21) ages[i] = 0;
}
作爲一個例子,但現在我想這樣做的過程中多線程環境。 是否有一個Concurrent集合在多線程環境中模擬數組?
我有一個單線程環境以下過程:等效陣列的
int[] ages = { 40, 30, 18, 23, 60, 24 };
for (int i = 0; i < ages.Length; i++)
{
if (ages[i] < 21) ages[i] = 0;
}
作爲一個例子,但現在我想這樣做的過程中多線程環境。 是否有一個Concurrent集合在多線程環境中模擬數組?
最接近的解決方案是使用使用索引作爲關鍵字的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;
});
此代碼將完美適用於您的示例。下一次使用更復雜的東西,比如數組元素的總和。
希望得到這個幫助!
您可以嘗試使用並行LINQ(PLINQ),並讓淨兌現最終結果作爲數組;你的情況:
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();
'ConcurrentBag'也許 –
r1verside
不太,ConcurrentBag並不意味着保持索引排序。但請注意,這些代碼可以並行處理,而不會輕易與ParallelFor衝突。 – Miguel
ConcurrentBag不允許按索引訪問密鑰,這是我想要實現的。 –