1

要并行执行循环,我正在使用:

int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52};
parallel_for (1, 100, 1, [&](int i){ 
    int var1;
    for (var1=1; var1<=20000; var1++) {
        int var2, var3, var4;
        double u[45],pl;
        int values[16]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
        /* ... */
        for (var4=0; var4<16; var4++) {
            if (values[var4] != testValues[var4]) break;
        }
        /* ... */
    }
}

我可以确定parallel_for块内定​​义的所有变量(即var1, var2, var3, var4, u, pl, values)对于每个循环迭代都具有局部范围,即不会在线程或循环迭代之间共享?

此外,只要多个线程testValues只是读取(而不是写入),就可以安全地访问它们吗?

4

3 回答 3

1

lambda 中的所有变量对于执行它的线程都是本地的,所以是的,它们是安全的。

从/向 testValues 数组读取/写入在理论上是一种竞争条件,但如果您确保您只在同一时间读取而不是写入,或者只写入数组的不同部分,它应该是安全的。

于 2012-04-09T11:12:45.463 回答
1

在循环内声明的变量parallel_for遵循标准的 C++ 范围规则,因此它们对于执行该部分代码的每个线程都是本地的。

您只需要担心在外部声明的变量,如果以不安全的方式访问,可能会造成数据竞争。

于 2012-04-09T11:35:22.183 回答
1

这只不过是一个 C++11 lambda 表达式。的使用parallel_for不会以任何方式使其特别。所以它遵循这样一个表达式所遵循的所有规则。

就个人而言,我不会将&其用作捕获表达式,因为它太松散了,尤其是对于像这样的事情,您需要仔细控制在 lambda 表达式中使用哪些变量。

但是,是的,在 lambda 中声明的所有变量都将是线程本地的堆栈变量。这包括 lambda 函数的参数列表,但不包括捕获表达式,即使您使用“按值”捕获也是如此。

按值捕获的变量默认为 const,因此应将它们视为只读副本并且通常是安全的。如果 lambda 函数被声明为可变的,那么我不确定规则是如何工作的。

于 2012-04-09T12:49:59.653 回答