gpt4 book ai didi

C# - 并行 For 循环 : Parallel. For(); - 它们如何处理在它们之外声明的变量?

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:22 28 4
gpt4 key购买 nike

我有以下代码:

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

关于C# - 并行 For 循环 : Parallel. For(); - 它们如何处理在它们之外声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13764006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com