【问题标题】:C# - Parallel For loops: Parallel.For(); - How do they work with variables declared outside of them?C# - 并行 For 循环:Parallel.For(); - 它们如何处理在它们之外声明的变量?
【发布时间】:2012-12-07 13:24:55
【问题描述】:

我有以下代码:

string someVariable;

Parallel.For(0, maxCount, count =>
{
    Parallel.For(0, dimension, row =>
    {
        Parallel.For(0, dimension, col =>
        {
            someVariable = count + " " + row + " " + col;
            DoSomethingIndependent(someVariable);
        });
    });
});

所以我的问题是:在循环之外声明的字符串变量是否独立于每次迭代,或者循环的并行执行是否会因彼此之间的迭代而中断?我猜想该变量同时用于并行线程,因为它给了我一个“未处理的异常”。做这个的最好方式是什么?也许为每个并行迭代使用一个字符串数组?
提前致谢!

【问题讨论】:

  • 之后还需要someVariable吗?否则你应该在内部循环中声明它(var someVariable = count ...)。
  • @CodeCaster - 不,之后我不需要它。这个声明会显着减慢代码的执行速度吗?好吧,我想这比声明一个数组要好。没想到会这样,谢谢建议。我会试试的。
  • 谢谢,现在它工作正常,我很高兴没有性能差异。

标签: c# variables for-loop parallel-processing declaration


【解决方案1】:

您问题中的代码有很多问题。

1) 上面的 cmets 中没有人提到这一点,但 someVariable 正在被多个线程写入。这将导致正确性问题。您必须在内部循环中声明 someVariable,以便每个任务都有自己的 someVariable 实例来更新。

2) 声明变量的位置对性能的影响最小。这与上面提到的顺序循环的链接不同。在这里,编译器无法将可验证的实例化移入或移出并行循环,但假设您的循环正在执行大量工作,则实例化变量的开销应该是最小的。如果 DoSomethingIndependent 没有做真正的工作,那么并行化无论如何都不可能带来性能优势。

3) 像这样嵌套的每个循环使用三个并行不太可能非常有效。你最好只在外循环上为每个循环使用并行循环,而对内循环使用顺序循环。

4) 假设 rowscols 是指存储在某个二维数组中的一些数据,那么您应该颠倒两个内部循环的顺序。请记住,数组以行优先顺序存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 2018-10-14
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    相关资源
    最近更新 更多