2017-01-27 6 views
0

テキストファイルの単語と文字のバイグラムの出現をカウントするために並行プログラムを実装しようとしています。コアは、バイグラムを計算する2つの関数です。 mainでは、2つの関数のうちの1つを使ってスレッドを開始します。スレッドを開始してvectorにプッシュするメインのforがあります。C++でstd :: threadsのベクトルに関する問題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のでfilenamesは4つの要素の合計を持ってい dorian.txtと呼ばれる2つのテキストファイルがあります。プログラムは実行されますが、スレッドを出力する出力は意味をなさない。各スレッドは、特定のバイグラムのカウントを、バイグラム自体、彼が読んでいるファイルの名前、および彼のIDで印刷します。これが出力されます。

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

に動作します:

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

ことがありますか?あなたはそれをすべて投稿できますか? – ccpgh

+0

プログラムはそれほど大きくなく、プログラムはシーケンシャルバージョンで動作するので、コードの他の部分が働くので、エラーはそこにないと思います –

+1

あなたはこのC++ 11のタグを付けました...なぜもっとCを使用しないのですか? ++ 11? 'for(auto&thread:threads){スレッド - > join();スレッドを削除する。 } '。また、ベクトルにポインタだけでなくスレッドオブジェクトを保持させることもできます。 'threads.emplace_back(stentence_bigrams_letters、...);' –

答えて

0

私はこの問題を解決しました。 問題は、current_job.firstという文字列を参照として渡しているため、forループの繰り返しで参照が変更されていたことです。 ので、代わりの:

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

、今ではプログラムがどのように大きい

関連する問題