为什么一个线程共享的变量可以被一些线程读取而其他线程不能读取?

问题描述 投票:0回答:0

我有一个班级

Split
,它有一个类型为
const Params & params
的字段。变量在实例化时设置:

class Split
{
private:
// Problem parameters
const Params & params;

// ...
}

在实例化时一切似乎都很好,但稍后,当实例尝试访问其字段时,该字段是

NULL
而不是数据,正如 CLion LLDB 调试器向我展示的那样。

我每个线程都有一个

Split
实例,但据我所知,只有一个
params
变量,每个
Splits
都试图读取,但不会写入。
我几乎要为每个线程复制
params
,但我还没有那么绝望。 更奇怪的是,有些线程可以读取变量,有些则不能。

调试还揭示了以下内容:在函数调用之前,

Split
尝试读取
params
params
可通过 CLion 调试访问,但一旦我在函数调用中,它就不是。这是函数调用:

#pragma omp parallel for num_threads(nMaxThreads)
    for(int i=0; i < nMaxThreads; i++){
        populations[i].generatePopulation();
        if (params.verbose) std::cout << "----- THREAD " << omp_get_thread_num() <<" DONE WITH POPULATION INIT" << std::endl;
    }

函数中导致错误的地方(

Split::generalSplit()
是从
generatePopulation()
函数内部调用的)是这个:

void Split::generalSplit(Individual & indiv, int nbMaxVehicles)
{
    maxVehicles = std::max<int>(nbMaxVehicles, std::ceil(params.totalDemand/params.vehicleCapacity));
    // ...
}

这可能是什么,我该如何解决?

c++ openmp
© www.soinside.com 2019 - 2024. All rights reserved.