gpt4 book ai didi

c# - AsParallel 扩展的实际工作原理

转载 作者:太空狗 更新时间:2023-10-29 20:39:40 25 4
gpt4 key购买 nike

所以主题就是问题。

我得到 AsParallel 方法返回包装器 ParallelQuery<TSource>使用相同的 LINQ 关键字,但来自 System.Linq.ParallelEnumerable而不是 System.Linq.Enumerable

这很清楚,但是当我查看反编译的源代码时,我不明白它是如何工作的。

让我们从最简单的扩展开始:Sum() 方法。代码:

[__DynamicallyInvokable]
public static int Sum(this ParallelQuery<int> source)
{
if (source == null)
throw new ArgumentNullException("source");
else
return new IntSumAggregationOperator((IEnumerable<int>) source).Aggregate();
}

清楚了,我们去Aggregate()方法。它是 InternalAggregate 方法的包装器,可以捕获一些异常。现在让我们来看看它。

protected override int InternalAggregate(ref Exception singularExceptionToThrow)
{
using (IEnumerator<int> enumerator = this.GetEnumerator(new ParallelMergeOptions?(ParallelMergeOptions.FullyBuffered), true))
{
int num = 0;
while (enumerator.MoveNext())
checked { num += enumerator.Current; }
return num;
}
}

问题来了:它是如何工作的?我看不到由许多线程修改的变量的并发安全性,我们只看到迭代器和求和。它是魔法枚举器吗?或者它是如何工作的? GetEnumerator()返回 QueryOpeningEnumerator<TOutput> ,但它的代码太复杂了。

最佳答案

最后,在我的第二次 PLINQ 攻击 中,我找到了答案。这很清楚。问题是枚举器并不简单。很特别multithreading一。那么它是如何工作的呢?答案是 enumerator不返回源的下一个值,它返回下一个分区的总和。因此,当在 Environment.ProcessorCount执行实际求和工作时,此代码仅执行 2、4、6、8... 次(基于 enumerator.MoveNext )在 enumerator.OpenQuery方法

因此 TPL 显然对源可枚举进行分区,然后独立地对每个分区求和,然后执行此求和,请参阅 IntSumAggregationOperatorEnumerator<TKey> .这里没有魔法,只是可以深入。

关于c# - AsParallel 扩展的实际工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381205/

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