2017-01-27 5 views
0

Я пытаюсь реализовать параллельную программу для подсчета вхождения биграмм слов и букв в текстовых файлах. Ядром являются две функции, которые вычисляют битрамы. В main я запускаю потоки с одной из двух функций. Существует главный for, который запускает потоки и толкает их в vector.Проблемы с вектором std :: threads в C++ 11 подсчет битрамов букв и слов

std::vector<std::thread *> threads; 
std::pair<std::string, int> current_job; 


for (unsigned int i = 0; i < num_threads; i++) { 
    current_job = filenames.front();// ex. <baskerville.txt, 1> 
    filenames.pop(); 
    if (current_job.second == 0) { 
     threads.push_back(new std::thread(sentence_bigrams_letters, std::cref(current_job.first), std::ref(v), 
              std::ref(lock_chars))); 
    } else if (current_job.second == 1) { 
     threads.push_back(
       new std::thread(sentence_bigrams, std::cref(current_job.first), std::ref(m), std::ref(lock_words))); 
    } 

} 

for (unsigned int k = 0; k < threads.size(); k++) { 
     threads.at(k)->join(); 
     delete (threads.at(k)); 
    } 

Есть два текстовых файла называемые baskerville.txt и dorian.txt так filenames имеет в общей сложности 4 элементов. Программа работает, но вывод, который печатает потоки, не имеет смысла. Каждый поток печатает счетчик конкретного биграма с самим биграммом, именем файла, который он читает, и его идентификатором. Это выход:

199 y,t .\Text\dorian.txt 4 /letters 
398 y,t .\Text\dorian.txt 2 /letters 
33 a, few .\Text\dorian.txt 3 /words 
66 a, few .\Text\dorian.txt 5 /words 

Это не имеет никакого смысла для меня, так что если кто-то имеет понятия о том, что происходит на нем было бы очень полезно.

+0

насколько большой это программа? вы могли бы опубликовать все это? – ccpgh

+0

программа не такая большая, а другие части кода работают, потому что программа работает в последовательной версии, поэтому я думаю, что ошибки там нет –

+1

Вы отметили этот C++ 11 ... почему бы вам не использовать больше C++ 11? Подобно 'for (auto & thread: threads) {thread-> join(); удалить обсуждение; } '. Кроме того, вы можете заставить вектор удерживать объекты потока сами по себе, а не только указатели, используйте 'threads.emplace_back (stentence_bigrams_letters, ...);' –

ответ

0

Я решил проблему. Проблема заключалась в том, что я передаю строку current_job.first как ссылку, и ссылка была изменена в итерациях цикла for. Таким образом, вместо:

threads.push_back(new std::thread(sentence_bigrams_letters, std::cref(current_job.first), std::ref(v), 
             std::ref(lock_chars))); 

это:

threads.push_back(new std::thread(sentence_bigrams_letters, current_job.first, std::ref(v), 
              std::ref(lock_chars))); 

и теперь он работает