代码之家  ›  专栏  ›  技术社区  ›  Gareth

更改c parallel.for循环的增量值

  •  5
  • Gareth  · 技术社区  · 15 年前

    我想将for循环转换为使用tpl的并行for循环,该循环每次将迭代器递增2。数据不依赖于顺序,也不以任何方式受到约束,但我只想处理源数组中每个其他元素中的数据(在下面的代码中是数据列表),因此需要增加2。

    我的循环:

    for (int i = 1; i < _DataList.Length - 1; i += 2)
    {
         // Do work for _DataList[i]
    }
    

    有没有可能告诉并行循环我想增加2而不是1?

    这是并行循环,但显然我每次迭代只增加1个:

            Task.Factory.StartNew(() =>
                Parallel.For(1, _DataList.Length, i =>
                {
                    // do work for _DataList[i]                    
                })
            );
    

    我可以告诉内部循环体忽略i的奇数值,但这看起来有点混乱——在循环初始化中有没有一种方法可以做到这一点?

    4 回复  |  直到 10 年前
        1
  •  10
  •   Darin Dimitrov    15 年前

    怎么样:

    var odds = Enumerable.Range(1, _DataList.Length).Where(i => i % 2 != 0);
    
    Task.Factory.StartNew(() =>
        Parallel.ForEach(odds, i =>
        {
            // do work for _DataList[i]                    
        })
    );
    
        2
  •  10
  •   dtb    15 年前

    您可以将步骤数减半并将索引翻倍:

    Parallel.For(0, _DataList.Length / 2, i =>
    {
        // do work for _DataList[2 * i]                    
    });
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    Darin Dimitrov's answer 显示了一个简单的方法来完成这一点。

    然而,这并没有被添加,因为这通常是一个迹象,表明循环体并不是真正独特的。在大多数情况下,使用不同的增量值的需求通常只需要以特定的顺序进行处理,或者需要其他关注点,这些关注点将导致并行化以创建竞争条件。

        4
  •  -1
  •   Junior    10 年前

    跳过偶数值。

    Task.Factory.StartNew(() =>
                    Parallel.For(1, _DataList.Length, i =>
                    {
                        if(i % 2 == 0)
                        {
                            // do work for   
                        }   
                    })
                );