gpt4 book ai didi

c++ - 多线程导致分段违规

转载 作者:行者123 更新时间:2023-12-01 14:29:05 25 4
gpt4 key购买 nike

我编写了以下代码,旨在从三个向量中按“接近”顺序生成三元组(每个向量贡献一个元素)的列表。在我引入多线程之前,代码一直工作完美。现在,它运行了一段时间,然后出现“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], vec02[j]), 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, 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,kdiff=DBL_MAX重置为0。

关于c++ - 多线程导致分段违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com