как правильно использовать мьютекс в c ++? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть вызываемый класс (класс с оператором), который выполняется несколькими потоками. Теперь я заметил, что результаты моего вектора результатов различаются в зависимости от количества потоков. Думаю, я неправильно использую мьютекс. Прежде всего, мой код:

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 полностью отличается. Например, первая запись моего вектора результатов: 847, 3161, 70 для 4 потоков и для 2 потоков первая запись: 1679, 3161, 70 (sox3_index, j, score). 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 тоже будут правильными. Нужны ли они мне и для будущих ценностей?

...