填充二维向量的parallel_for lambda函数后出错

Posted

技术标签:

【中文标题】填充二维向量的parallel_for lambda函数后出错【英文标题】:Error after parallel_for lambda function filling a 2D-vector 【发布时间】:2017-06-07 09:47:33 【问题描述】:

长话短说:我遇到了一些引发我无法理解的错误的代码(请见谅,我是 C++ 新手)。 我的代码(简化)执行以下操作:

vector<vector<double>> AmplCo;
AmplCo.resize(1025, vector<double>(65, 0));

Concurrency::parallel_for((long)0, (long)65, [&](long i) 

    for (j = 0; j <= 64; j++)
    
        PhiRad = double(j) / 128 * PI;
        CosPhi = cos(PhiRad); SinPhi = sin(PhiRad);
        RealCoij = static_cast<double>(RealCo[j * 1025 + i]);
        A = RealCoij * CosPhi;
        B = RealCoij * SinPhi;
        AmplCo.at(i).at(j) =log10(A * A + B * B);
    

);                  // <- A breakpoint here is reached
RealCo = nullptr;    // <- A breakpoint here is never reached

RealCo 当然是一个指针。

执行没有到达RealCo = nullptr;,因为在 lambda 函数的末尾和该行之间,我得到了一个未处理的异常。

知道我做错了什么吗?

编辑:再一次,如果你想投反对票,至少要有礼貌地解释原因。

【问题讨论】:

不相关也不确定,但我认为您可以使用0L 来代替(long) 0 索引RealCo[j * 1025 + i] 看起来可能超出范围 RealCo 在我的示例中是从 c++ 外部传递的0 to 1024 x 0 to 64 二维数组。我不确定它是否会越界,因为它不会在那一行引发错误 抛出哪一行,异常是什么? lambda 函数结束。现在编辑答案以强调这一点 【参考方案1】:

好的,我发现了错误:多线程不太喜欢 parallel_for 之前已经初始化的变量,所以我必须将它们(基本上全部)设置为私有:

for (long j = 0; j <= 64; j++)
    
        double PhiRad = double(j) / 128 * PI;
        double CosPhi = cos(PhiRad); double SinPhi = sin(PhiRad);
        double RealCoij = static_cast<double>(RealCo[j * 1025 + i]);
        double A = RealCoij * CosPhi;
        double B = RealCoij * SinPhi;
        AmplCo.at(i).at(j) =log10(A * A + B * B);
    

问题很可能是 2 个线程同时访问 j

【讨论】:

以上是关于填充二维向量的parallel_for lambda函数后出错的主要内容,如果未能解决你的问题,请参考以下文章

IfcFillAreaStyleTiles

c++中的二维向量问题

在 C++ 中重塑二维向量

用向量填充c ++中的简单动态数组[重复]

在我给二维向量赋予第一个值后控制台关闭

在 parallel_for 中使用函数对象