如何在C ++中正确使用互斥锁?

我有一个由多个线程运行的可调用类(带有运算符的类)。现在我注意到,结果向量的结果取决于线程数而有所不同。我想我使用互斥体是错误的。首先是我的代码:

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也正确的话。我还需要它们来实现未来的价值吗?

iCMS 回答:如何在C ++中正确使用互斥锁?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1804883.html

大家都在问