내가 시작한 std::thread
다음 detach()
스레드를 실행 한다고 가정 하면 스레드 std::thread
가 한 번 표현 했지만 스레드가 계속 실행되지 않습니다 .
또한 프로그램에 분리 된 스레드 1 을 결합하기위한 신뢰할 수있는 프로토콜이 없으므로 분리 된 스레드가 main()
종료 될 때에도 계속 실행 됩니다.
표준에서 (더 정확하게는 N3797 C ++ 14 초안에서) 아무것도 찾을 수 없으며, 1.10도 30.3도 관련 문구를 포함하지 않아야합니다.
1 또 다른, 아마도 동등한 질문은 "연결 해제 된 스레드를 다시 결합 할 수 있습니까?"입니다. 결합하려는 프로토콜이 무엇이든 스레드가 여전히 실행중인 동안 신호 부분을 수행해야하고 OS 스케줄러가 수신단이 스레드가 실제로 완료되었음을 확실하게 감지 할 수있는 방법이없는 신호 처리 직후에 스레드를 1 시간 동안 휴면 상태로두기로 결정합니다.
부족하면 main()
분리 된 스레드가 실행하는 것은 정의되지 않은 동작은 다음 어떤 의 사용은 std::thread::detach()
메인 스레드가 종료하지 않는 한 정의되지 않은 동작이다 (2) .
따라서 main()
분리 된 스레드가 실행 중이면 정의 된 효과 가 있어야합니다 . 질문 : 어디 합니다 (에 C ++ 표준 이 아닌 POSIX가 아닌 OS 워드 프로세서, ...) 정의 된 효과가 있습니다.
2 분리 된 스레드는 (의미에서 std::thread::join()
) 결합 될 수 없습니다 . 분리 된 스레드의 결과를 기다릴 수 있습니다 (예 :에서를 통해 std::packaged_task
또는 세마포어 또는 플래그 및 조건 변수를 통해) 스레드가 실행을 완료 한 것은 아닙니다 . 당신이 스레드의 첫 번째 자동 개체의 소멸자에 신호 부분을 넣어하지 않는 사실,이 것 , 일반적으로 실행되는 코드 (소멸자) 일 후 시그널링 코드입니다. OS가 메인 스레드가 결과를 소비하고 분리 된 스레드가 소멸자를 실행하기 전에 종료하도록 예약하는 경우 어떻게됩니까?
std::exit
또는 종료 전에 모든 스레드를 종료하는main
것만 으로 는 충분하지만 필수는 아닙니다." (전체 단락이 관련 될 수 있음) [support.start.term] / 8 참조 ( 반환std::exit
시 호출main
)