并行编程互锁c#
本文关键字:编程 并行 | 更新日期: 2023-09-27 18:14:16
我对
的例子感到困惑http://msdn.microsoft.com/en-us/library/dd997393.aspxParallel.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) );
我不知道为什么最后一个代表(finalResult) => Interlocked.Add(ref total,finalResult)
需要Interlock,而前面的表达式
(j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
},
不?
谢谢
Parallel.For()
和Parallel.ForEach()
方法使用了分区器。在10,000个单独的task上执行超过10,000个元素的循环将是非常低效的。分区器将数据分成段,理想情况下,ForEach()
将在4核CPU上的4个任务(线程)中执行2500个元素。这有时需要一些启发,您可以编写自己的自定义分区程序。
当使用ForEach()
的"正常"(简单)过载时,这是完全透明的。但是您的示例使用的是一个<TLocal>
过载,它暴露了分区。
subtotal += nums[j];
语句在一个分区内迭代,因此是线程安全的。
(finalResult) => Interlocked.Add(ref total,finalResult)
是合并分区的地方,这部分当然不是线程安全的。
变量subtotal
是只有一个线程可以访问的"本地数据"。
另一方面,total
是一个所有线程都可以修改的变量,并且可能有几个线程试图同时更新总数。