Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行编程联锁C#_C#_.net_Parallel Processing_Interlocked - Fatal编程技术网

并行编程联锁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; 
                                    },