テキストファイルの単語と文字のバイグラムの出現をカウントするために並行プログラムを実装しようとしています。コアは、バイグラムを計算する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
誰かがそれで何が起こっているかについての手掛かりを持っている場合は本当に参考になるので、それは私にはどんな意味がありません。
に動作します:
ことがありますか?あなたはそれをすべて投稿できますか? – ccpgh
プログラムはそれほど大きくなく、プログラムはシーケンシャルバージョンで動作するので、コードの他の部分が働くので、エラーはそこにないと思います –
あなたはこのC++ 11のタグを付けました...なぜもっとCを使用しないのですか? ++ 11? 'for(auto&thread:threads){スレッド - > join();スレッドを削除する。 } '。また、ベクトルにポインタだけでなくスレッドオブジェクトを保持させることもできます。 'threads.emplace_back(stentence_bigrams_letters、...);' –