多线程导致分段违规

问题描述

我编写了以下代码,旨在从三个向量中按“接近”顺序生成三元组(每个向量贡献一个元素)的列表。在我引入多线程之前,代码一直工作完美。现在,它运行了一段时间,然后出现“ BREAK ****细分违规****”错误。这可能是基本的东西,但是我是C ++多线程的新手,而且我似乎在引用等中找不到任何内容。

请注意,我已经用伪代码替换了几行几乎不相关的/专用的/冗长的代码,以提高可读性。


更新: 我确定原因是用于从向量中删除值的三行。如果有人能说明为什么会这样,我很好奇。


更新: 哎呀!愚蠢的简单错误。对于每次迭代,i,j,k需要设置为0。

void findClosest(std::vector<double> vec01,std::vector<double> vec02,std::vector<double> vec03,TH2 *histo ){

    

    int len01 = vec01.size(); int len02 = vec02.size(); int len03 = vec03.size();

    int i = 0; int j = 0; int k = 0; int iter = 0;
    int res_i,res_j,res_k;
    int iter_count = len01;

    double diff = DBL_MAX;

    while(iter < iter_count){ 
        while(i < len01 && j < len02 && k < len03){

            double minVal = std::min( std::min(vec01[i],vec02[j]),vec03[k]);
            double maxVal = std::max( std::max(vec01[i],vec03[k]);

            if(fabs(maxVal - minVal) < diff){ 
                res_i = i;
                res_j = j; 
                res_k = k;
                diff =  maxVal - minVal;
            }

            if(vec01[i] == minVal){
                ++i;
            } else if(vec02[j] == minVal){
                ++j;
            } else {
                ++k;
            }

        }

    std::cout << std::setprecision(100) << vec01[res_i] << " " << vec02[res_j] << " " << vec03[res_k] << " " << len01 <<  "\n";
    
    //Do something with the result

    vec01.erase(vec01.begin() + res_i);
    vec02.erase(vec02.begin() + res_j);
    vec03.erase(vec03.begin() + res_k);

    --len01; --len02; --len03;
    ++iter;

    }

}

int main(){

    TH2 *histo = new TH2D("Histogram","Histogram",1,-1,1);


    //Populate the vectors
    //Split each (of three) vectors into halves (right/left)

    std::thread firstThread(findClosest,vec01_left,vec02_left,vec03_left,std::ref(histo));
    std::thread secondThread(findClosest,vec01_right,vec02_right,vec03_right,std::ref(histo));
        
    firstThread.join();
    secondThread.join();    

    //Do some more stuff

}

如果我只用一次调用函数来替换用于实现线程的行,那就很好用了。请原谅偶尔的“错误”。这是一项正在进行的工作。

解决方法

从向量中删除三元组时发生错误。一个简单的超出范围的问题。 i,j,k每次迭代都需要重置为0(以及diff=DBL_MAX

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...