2017-01-27 3 views
0

텍스트 파일에서 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.txtfilenames 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 

:이 출력됩니다.

+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)와 같이 {thread-> 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))); 

와 지금은 프로그램이 얼마나 큰

관련 문제