다음 테스트 프로그램이 잘 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 초의 일시 중지를하면 동일한 아웃웨어를 얻으므로 경쟁 문제가 아닙니다. 출력이 여전히 같은 방식으로 정렬된다는 것은 흥미 롭습니다. 어떤 아이디어?
FYI cplusplus.com은 신뢰할 수없는 사이트입니다. cppreference.com에서 의존하고있는 행동을 다시 확인하는 것이 좋습니다. –
다음에 플러시 될 때까지 버퍼링되는 'cout'을 작성 중입니다. 그런 다음 오류가 발생하여 'cerr'에 쓰여지고 즉시 (버퍼링없이) 쓰여집니다. 마지막으로'cout' 버퍼가 플러시됩니다. BTW : 나는 경고를 켜지 않는 한이 "컴파일 된 [...] 그냥 괜찮은"당신의 주장을 구입하지 않습니다! –