[英]C# - Parallel For loops: Parallel.For(); - How do they work with variables declared outside of them?
我有以下代码:
string someVariable;
Parallel.For(0, maxCount, count =>
{
Parallel.For(0, dimension, row =>
{
Parallel.For(0, dimension, col =>
{
someVariable = count + " " + row + " " + col;
DoSomethingIndependent(someVariable);
});
});
});
所以我的问题是:在循环外部声明的字符串变量是否与每次迭代无关,或者循环的并行执行是否会因彼此之间的迭代而中断? 我猜想该变量是同时使用到并行线程的,因为它给了我一个“未处理的异常”。 做这个的最好方式是什么? 也许为每个并行迭代使用字符串数组?
提前致谢!
您的问题中的代码有很多错误。
1)没有人在上面的评论中提及此问题,但是someVariable被多个线程写入。 这将导致正确性问题。 您必须在内部循环中声明someVariable ,以便每个任务都有自己的someVariable实例进行更新。
2)声明变量对性能的影响最小。 这与上面引用顺序循环的链接不同。 在这里,编译器无法将可验证的实例移入或移出并行循环,但假设您的循环正在做大量工作,则实例化变量的开销应最小。 如果DoSomethingIndependent没有做实际的工作,那么并行化它无论如何都不会带来性能上的好处。
3)对于这样嵌套的每个循环,使用三个并行是不太有效的。 您最好只在外部循环中为每个循环使用一个并行,然后对内部两个循环使用顺序循环。
4)假设行和cols参照存储在2D阵列然后某处你应该反转两个内部循环的顺序的一些数据。 请记住,数组以行优先顺序存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.