填充二维向量的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函数后出错的主要内容,如果未能解决你的问题,请参考以下文章