gpt4 book ai didi

c# - 并行编程互锁 C#

转载 作者:行者123 更新时间:2023-11-30 14:38:21 27 4
gpt4 key购买 nike

我对示例感到困惑

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com