并行编程互锁c#

本文关键字:编程 并行 | 更新日期: 2023-09-27 18:14:16

我对

的例子感到困惑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)                                        );

我不知道为什么最后一个代表(finalResult) => Interlocked.Add(ref total,finalResult)需要Interlock,而前面的表达式

(j, loop, subtotal) => 
                                    {
                                        subtotal += nums[j]; 
                                        return subtotal; 
                                    },

不?

谢谢

并行编程互锁c#

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是一个所有线程都可以修改的变量,并且可能有几个线程试图同时更新总数。