8

,이 코드 : 왜 boost :: thread의 소멸자가 표준으로 terminate()를 호출하는 대신 joinable 스레드를 분리합니까? 초안 C++ 0X 표준에 따라

void simplethread() 
{ 
    boost::thread t(someLongRunningFunction); 
    // Commented out detach - terminate() expected. 
    // t.detach(); 
} 
이 ... 종료() 호출 결과,하지만 '그것은 아무튼 부스트 스레드의 현재 (부스트 1.46.1) 구현한다 스레드는 단순히 소멸자에서 분리되어 계속됩니다.

내 질문은 무엇입니까?

나는 boost :: thread가 초안 표준이되는 많은 인라인이라고 생각했다.

설계 이유가 있습니까? boost :: thread의 이후 버전에서 변경 될 예정입니까?

+2

참조 http://stackoverflow.com/questions/4508181/thread-destructors-in-c0x-vs-boost –

답변

22

이유는 크게 역사적입니다. boost::thread이 먼저 왔습니다. std::thread에 대한 제안은 boost::thread에서 파생되었으며 원래는 boost::thread의 동작을가집니다.

그러나 아직 표준화 과정 중에 많은 수의 사람들이 detach() 대신에 소멸자에 std::thread::~thread()에서 join()을 소멸자로 연결하려고합니다. 각 측에 대한 논쟁이 이루어졌고 득표가 취해졌다. 50/50. 더 많은 논쟁이 있었고 더 많은 표가 얻어졌습니다. 어떤 사람들은 다른 위치로 흔들 렸습니다. 그러나 여전히 50/50.

누군가 (기억하지 못함) terminate()을 제안했습니다. 투표가 이루어졌으며 만장일치가 아니었지만 (투표 할 수는 없었 음), 합의에 이르는 데는 대다수의 찬사를 받았다.

boost::thread은 사용자 기반이 설치되어 있고 아무도 그 사용자 기반의 코드를 불필요하게 중단하기를 원치 않으므로 변경되지 않았을 것이라고 생각합니다.

편집 :

아, 롭이 중복 된 질문의 원본과 이론적 근거를 포함 N2802 해당 대답 점에 우리를 가리 킵니다.

std::thread의 원래 제안은 스레드 취소가 있었음을 유의해야하며 ~ thread()는 결합되지 않은 스레드를 취소 한 다음 분리하여 많은 의미가 있습니다. 이 코드 경로는 일반적으로 부모 스레드가 예외로 인해 풀릴 때만 선택됩니다.