我有一个由多个线程运行的可调用类(带有运算符的类)。现在我注意到,结果向量的结果取决于线程数而有所不同。我想我使用互斥体是错误的。首先是我的代码:
void operator() (const string &segment,const string &segment2) {
for(size_t i=seq1_start; i < seq1_end-(seqLength-1); i++) {
for(size_t j=0; j < segment2.size()-(seqLength-1); j++) {
int score = compareSequences(segment.substr(i,seqLength),segment2.substr(j,seqLength));
// cout << segment.substr(i,seqLength) << " " << segment2.substr(j,seqLength) << endl;
if(score >= 70) {
lock_guard<mutex>guard(mutex_result);
results_before_postProcessing.push_back(triple(sox3_index,j,score));
cout << sox3_index << " " << j << " " << score << endl;
}
}
sox3_index++;
}
}
我比较了2和4个线程的输出。两个结果的j索引和分数似乎相同,但sox3_index完全不同。例如,我的结果向量的第一个条目是:4个线程的847,3161,70,对于2个线程,第一个条目是:1679,3161,70 (sox3_index,j,得分)。将sox3_index和results_before_postProcessing声明为全局,并按以下方式启动线程:
for(size_t i=0; i < numberOfThreads; i++) {
threads[i] = thread(tasks[i],parts[i],seq_sry);
this_thread::sleep_for(chrono::milliseconds(20));
}
当我将分数设置为未来值时,这也许是正确的方法吗?据我对未来的了解:然后,线程被阻塞,直到它从compareSequences中获取值为止,我将其称为异步。但是我不确定,如果j索引和sox3_index也正确的话。我还需要它们来实现未来的价值吗?