2011-01-12 7 views
20

Visual Studio C++에서 beginthreadex, endthreadex 호출을 사용하여 멀티 스레드 프로그래밍을 수행하고있었습니다.부모 스레드가 종료 될 때 자식 스레드가 종료합니까?

나는 하위 스레드 thread1을 생성합니다. 자식 스레드는 무한 루프가 있으므로 종료하지 않는 함수에서 실행됩니다. 이제 상위 스레드가 오류로 종료되거나 성공적으로 완료되면 하위 스레드도 종료됩니까? 내 의심은 - 메인 프로그램이 종료 된 후에도 자식 스레드가 살아있는 상황이 있습니까?

리눅스의 경우이 경우 어떻게해야합니까?

+1

다음은 밀접한 관련 질문입니다. http://stackoverflow.com/questions/2197699/is-it-necessary-to-explicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth

+0

게시물에 충돌하는 답변이 있습니다. – excray

+0

@ user97642 귀하의 입장에서 어떤 충돌이 있습니까? 대답은 모두 나에게 비슷하게 보입니다. –

답변

31

스레드 간에는 상위/하위 관계가 없습니다. 스레드 A가 스레드 B를 만들고 스레드 A가 종료되면 스레드 B는 계속 실행됩니다.

주 스레드 (즉, main() 함수를 실행하는 스레드)가 종료 될 때 예외입니다. 이 경우 프로세스가 종료되고 다른 모든 스레드가 중지됩니다.

+5

두 가지 예외. 어떤 스레드가'exit'를 호출하면 * 모든 * 스레드가 종료됩니다. – EML

+1

실행중인 스레드에서'detach'를 호출하지 않고'main'이 존재한다면 예외를 던질 것이라고 덧붙이고 싶습니다. – Everyone

7

C 및 C++ mandate that returning from the main function kills all running threads이므로 예, 프로세스가 없어야합니다. 그리고 그 행동은 런타임에 의해 이루어지기 때문에 상황은 리눅스에서 동일해야합니다.

+0

당신이 제공 한 링크는 * 모든 스레드를 죽이는 * (!) 언어 요구 사항에 대해서는 아무 것도 말하지 않습니다. main에서 리턴하는 것이 exit()를 호출하는 것과 동등하다는 요구 사항만을 언급하고있다. –

2

즉시 모든 자원 (메모리, 파일 및 스레드)

이 작업을 수행하는 올바른 방법 발표되는 프로세스 다이로 : 당신이 beginthread를 호출 할 때, 부모 스레드에서 반환 된 핸들을 유지, 그리고 프로그램을 종료하기 전에 WaitForObject으로 전화하십시오 (은 하위 스레드가있는 부모 스레드에 참여).

부모 스레드는 자식 스레드가 완료 될 때까지 차단됩니다. 자식 스레드에 무한 루프가있는 경우 "중단 지점"을 정의하고 나가야하는지 확인할 수 있습니다. 예를 들어 공유 부울 변수를 사용합니다. 더 자세한 정보는 Interrupt Politely을 확인하십시오.

+0

프로그램이 정상적으로 종료 될 때, 즉 main()의 끝에 도달하면 문제가 발생하지 않습니다. 그러나 exit()를 호출하는 기본 스레드 나 상위 스레드에는 많은 위치가 있습니다. 그래서 exit()는 모든 쓰레드를 죽일 것인가? – excray

+0

@ user97642 주 스레드가 종료되면 다른 모든 스레드가 중지됩니다. –

+2

세마포, 핸들 등의 무한 대기로 인해 Windows 및 Linux 모두에서 프로세스가 좀비가 될 수 있습니다. 그렇지 않으면 다른 사람들이 말하는 것과 같습니다. 주 스레드가 죽으면 나머지는 모두 죽습니다. – JimR

관련 문제