我对示例感到困惑
http://msdn.microsoft.com/en-us/library/dd997393.aspx
Parallel.ForEach<int, long>(nums, // source collection
() => 0, // method to initialize the local variable
(j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
},
(finalResult) => Interlocked.Add(ref total,finalResult) );
我不知道为什么最后一个委托(delegate) (finalResult) => Interlocked.Add(ref total,finalResult)
需要互锁,而前面的表达式
(j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
},
不是吗?
谢谢
最佳答案
Parallel.For()
和 Parallel.ForEach()
方法使用分区器。在 10,000 个单独的任务上执行超过 10,000 个元素的循环是非常低效的。分区程序将数据分成多个段,理想情况下是 ForEach()
将在 4 核 CPU 上以 2,500 个元素的 4 个任务(线程)执行。这有时需要一些启发式方法,您可以编写自己的自定义分区程序。
当使用 ForEach()
的“正常”(简单)重载时这是完全透明的。但是您的示例使用了 <TLocal>
之一显示分区的重载。
subtotal += nums[j];
语句在 1 个分区内迭代,因此是线程安全的。
和(finalResult) => Interlocked.Add(ref total,finalResult)
是合并分区的地方,这部分当然不是线程安全的。
关于c# - 并行编程互锁 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110346/