长话短说:我遇到了一些引起错误的代码,我无法理解(请怜悯,我是c ++新手)。
我的代码(dumbed down)执行以下操作:
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函数的结尾与该行之间,我得到一个未处理的异常。
知道我做错了什么?
编辑:再一次,如果你想进行投票,至少要有一些体面的解释为什么。
答案 0 :(得分: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
。