如何解决多线程导致分段违规
我编写了以下代码,旨在从三个向量中按“接近”顺序生成三元组(每个向量贡献一个元素)的列表。在我引入多线程之前,代码一直工作完美。现在,它运行了一段时间,然后出现“ 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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。