2014-06-06 3 views
2

나는 C++ 11 스레드에 대한 책을 읽은 한을 사용하여 호출 내가 C++ 11 스레드 : 예외 람다

#include <iostream> 
#include <thread> 

using namespace std; 

void doSomething() { cout << "Inside doSomething " << endl; } 
void doSomethingElse() { cout << "Inside doSomethingElse " << endl; } 

int main(void) 
{ 
    // Using LAMBDA expressions to call the functions. 
    thread my_thread([](){ doSomething(); doSomethingElse(); }); 
    //my_thread.join(); ---------------> 1 

    return 0; 
} 

않았다 나는 my_thread.join()를 호출하지 않고, 비주얼 스튜디오 2013 "던지고을 코드를 실행하려고 abort()가 호출되었습니다. " 이유가 무엇입니까?

답변

5

이것은 람다와 아무 관련이 없습니다. threadjoinable 인 경우 소멸자가 실행될 때 std::terminate이 호출됩니다. 이를 피하려면 이어야하며 thread::join 또는 thread::detach으로 전화하십시오. 표준은 메모에서이 결정의 근거를 제공하기까지 계속됩니다.

~thread(); 

[thread.thread.destr] §30.3.1.3/1 가입일 joinable() 경우 std::terminate() 부른다. 그렇지 않으면 효과가 없습니다. [참고 : 소멸자에 joinable() 스레드를 암시 적으로 분리하거나 결합하면 예외 발생시에만 발생하는 디버그 정확성 (분리) 또는 성능 (조인) 버그를 디버그하기가 어려울 수 있습니다. 따라서 프로그래머는 스레드가 여전히 조인 할 수있는 동안 소멸자가 실행되지 않도록해야합니다. -end 노트] 초기 C++ 0X에서

하면 joinable() 다음 detach()로 사용되는 문구, 그렇지 않으면 효과를 초안. ...

N2802에는 나중에 소멸자에서 detach()의 암시 적 호출이 제거 된 이유에 대한 추가 세부 정보가 들어 있습니다.