parallel_for lambda函数填充2D向量后出错

时间:2017-06-07 09:47:33

标签: c++ multithreading for-loop vector concurrency

长话短说:我遇到了一些引起错误的代码,我无法理解(请怜悯,我是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函数的结尾与该行之间,我得到一个未处理的异常。

知道我做错了什么?

编辑:再一次,如果你想进行投票,至少要有一些体面的解释为什么。

1 个答案:

答案 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