2016-06-17 4 views
0
에 합류

다음 테스트 프로그램이 잘 g++ -o test -pthread -std=c++11 test.cpp로 컴파일 : 실행하면예외 스레드

#include <iostream> 
#include <vector> 
#include <thread> 
#include <chrono> 

using namespace std; 

void foo(int); 

int main() 
{ 
     vector<thread> threads(5); 
     for (int i = 0; i < 5; i++) 
     { 
       threads.push_back(thread(foo, i)); 
     } 

     for (vector<thread>::iterator iter = threads.begin(); iter != threads.end(); iter++) 
     { 
       iter->join(); 
     } 
} 

void foo(int id) 
{ 
     cout << "thread " << id << " started."; 
     this_thread::sleep_for(chrono::seconds(10)); 
     cout << "thread " << id << " terminated."; 
} 

그러나,이 유사한 출력을 제공 :

terminate called after throwing an instance of 'std::system_error' 
    what(): Invalid argument 
thread thread 2 started.1 started.thread 4 started.thread 3 started.thread 0 started.Aborted (core dumped) 

내가 아무 생각이없는 경우이 오류 에서 온다. 디버깅에서, 나는 첫 번째 스레드에 합류하려고하자마자 오류가 발생한다는 것을 알고 있습니다.
http://www.cplusplus.com/reference/thread/thread/join/ 스레드가 조인 할 수없는 경우 조인은 invalid_argument을 throw합니다.

  • 이 기본적으로 건설되었다 :
    http://www.cplusplus.com/reference/thread/thread/joinable/는 스레드가있는 경우에만 결합 가능한 아니라고 주장한다.
  • 다른 스레드 개체를 구성하거나 할당합니다.
  • 구성원 중 하나가 조인 또는 분리가 호출되었습니다.

분명히 알 수 있듯이 스레드는 기본 구성되지 않았습니다.
다른 스레드 개체로 스레드를 덮어 쓰지 않습니다. 프로그램의 출력은 또한 "스레드 x가 시작되었습니다."와 같이 각 스레드가 명확하게 실행 중임을 보여줍니다. 진술에 도달했다.
각 스레드마다 한 번만 join을 호출합니다.

작성과 가입 사이에 5 초의 일시 중지를하면 동일한 아웃웨어를 얻으므로 경쟁 문제가 아닙니다. 출력이 여전히 같은 방식으로 정렬된다는 것은 흥미 롭습니다. 어떤 아이디어?

+0

FYI cplusplus.com은 신뢰할 수없는 사이트입니다. cppreference.com에서 의존하고있는 행동을 다시 확인하는 것이 좋습니다. –

+0

다음에 플러시 될 때까지 버퍼링되는 'cout'을 작성 중입니다. 그런 다음 오류가 발생하여 'cerr'에 쓰여지고 즉시 (버퍼링없이) 쓰여집니다. 마지막으로'cout' 버퍼가 플러시됩니다. BTW : 나는 경고를 켜지 않는 한이 "컴파일 된 [...] 그냥 괜찮은"당신의 주장을 구입하지 않습니다! –

답변

3

vector을 5 개의 기본 생성 스레드로 미리 설정하지 말고 무시한 다음 push_back 개의 추가 스레드를 무시하십시오. 그런 다음 join은 기본 생성 스레드와 결합을 시도합니다. (5)을 제거하거나 reserve 호출로 이동하십시오.

+0

그게 효과가! 나는 size를 기본 생성자로 호출한다는 사실에 대해서는 생각하지 않았다. – RogueCSDev