并行编程联锁C#
我对当时的例子感到困惑 不是吗并行编程联锁C#,c#,.net,parallel-processing,interlocked,C#,.net,Parallel Processing,Interlocked,我对当时的例子感到困惑 不是吗 谢谢变量小计是“本地数据”,只有一个线程可以访问 另一方面,total是一个所有线程都可以修改的变量,可能有几个线程会同时尝试更新total。并行。Parallel.For()和Parallel.ForEach()方法使用分区器。在10000个单独任务上执行超过10000个元素的循环是非常低效的。分区器将数据分割成段,理想情况下,ForEach()将在4核CPU上执行4个任务(线程),共2500个元素。这有时需要一些启发,您可以编写自己的自定义分区器 使用For
谢谢变量
小计
是“本地数据”,只有一个线程可以访问
另一方面,total
是一个所有线程都可以修改的变量,可能有几个线程会同时尝试更新total。并行。Parallel.For()
和Parallel.ForEach()
方法使用分区器。在10000个单独任务上执行超过10000个元素的循环是非常低效的。分区器将数据分割成段,理想情况下,ForEach()
将在4核CPU上执行4个任务(线程),共2500个元素。这有时需要一些启发,您可以编写自己的自定义分区器
使用ForEach()
的“普通”(简单)重载时,这是完全透明的。但是您的示例使用了一个显示分区的
重载
小计+=nums[j]代码>语句在1个分区内迭代,因此是线程安全的
和(finalResult)=>联锁。Add(ref-total,finalResult)
是合并分区的地方,这部分当然不是线程安全的
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) );
(j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
},