【问题标题】:Custom conditions Parallel.For自定义条件 Parallel.For
【发布时间】:2014-10-31 15:20:29
【问题描述】:

我知道下面这行

System.Threading.Tasks.Parallel.For(0, 5, (j, u) => {});

等于

for (int j = 0; j < 5; j++){}

但是什么是并行代码

for (int i = 0; (i < x + y && i < z); i++)

【问题讨论】:

  • 本案不包括在内。只需在函数体内相应地退出代码即可。

标签: c# for-loop parallel-processing


【解决方案1】:

听起来你真正想要的是一个 Parallel.While 构造,它不存在。您可以使用以下方法来近似功能:

public static void While( 
    ParallelOptions parallelOptions, Func<bool> condition, 
    Action<ParallelLoopState> body) 
{ 
    Parallel.ForEach(new InfinitePartitioner(), parallelOptions, 
        (ignored, loopState) => 
    { 
        if (condition()) body(loopState)); 
        else loopState.Stop(); 
    }); 
}

Stephen Toub 有一个关于它的博客 on MSDN

编辑:只是为了抛出另一个选项,您还可以根据我们的条件使用 LoopState 来打破 Parallel 循环。像这样的东西(来自here的伪代码:

Parallel.For(0, n, (i, loopState) => {

// ...

如果 (!(i i {

loopState.Break();

return;       

}});

【讨论】:

  • 请注意,这样的condition 委托需要是线程安全的,而这里看起来不是这种情况,因为它基于当前迭代(数据不能真的可以安全访问)。如果你不知道在前一次完成之前是否还会有另一次迭代,那么就没有什么可以并行化了。
【解决方案2】:

Parallel.For 并非旨在表示此类循环。它被严格设计为表示从循环开始就知道的迭代次数。

如果您想使用它,您需要在调用Parallel.For 之前计算所需的迭代次数。如果您不能合理地这样做,那么您将需要使用另一种并行化方式。

【讨论】:

    【解决方案3】:

    就个人而言,我会将条件分开,因此

    for (int i = x; (i < x + y && i < z); i++)
    

    变成

    int n = z < x + y ? x + y : z;
    System.Threading.Tasks.Parallel.For(x, n, (i) => { });
    

    【讨论】:

    • 这里假设xyz的值在循环开始之前都是已知的,并且在循环内永远不会改变。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2018-12-24
    • 2014-03-22
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2023-03-22
    相关资源
    最近更新 更多