2

我有以下代码:

string someVariable;

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

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

4

1 回答 1

0

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

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

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

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

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

于 2013-03-28T05:39:32.287 回答