【问题标题】:Error after parallel_for lambda function filling a 2D-vector填充二维向量的parallel_for lambda函数后出错
【发布时间】: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 函数结束。现在编辑答案以强调这一点

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2016-05-27
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多