텍스트 파일에서 bigrams의 단어와 글자를 발생시키는 동시 프로그램을 구현하려고합니다. 핵심은 바이 그램을 계산하는 두 가지 기능입니다. main
에서는 두 가지 기능 중 하나를 사용하여 스레드를 시작합니다. 스레드를 시작하고 vector
에 밀어 넣는 주 for
이 있습니다.C++에서 std :: threads 벡터에 문제가 있습니다. 11 글자와 단어의 bigram 수를 계산합니다.
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라는 두 개의 텍스트 파일이 있습니다. 프로그램은 실행되지만 스레드를 인쇄하는 출력은 의미가 없습니다. 각 스레드는 특정 bigram의 수를 bigram 자체, 그가 읽는 파일의 이름 및 그의 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)와 같이 {thread-> join(); 스레드 삭제; }'. 또한, 벡터 대신 포인터 대신 스레드 객체를 보유하게하고,'threads.emplace_back (stentence_bigrams_letters, ...);를 사용하면된다. –