c# - 并行编程互锁 C#

标签 c# .net parallel-processing interlocked

我对示例感到困惑

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/

相关文章:

c# - 在 MSTest 中,如何指定某些测试方法不能相互并行运行?

c# - 确定哪个列表框的事件已经启动

c++ - 使用TBB并行创建 vector

f# - STATHREAD 作为 F# 中的异步工作流程

c# - 如何使用 MediaInfo 库在 C#/.NET 中提取封面艺术?

c# - 在 GridView 中,我的 Roe 未更新或删除

c# - Azure AppService 将Word转换为PDF

c# - 如何预测船舶与人体在二维影响范围内的相遇

c# - 在屏幕左下角放置一个小的控制台窗口?

大括号内的正则表达式(大括号)——gnu parallel/xargs/find