2013-10-08 2 views
0

내 데스크톱 응용 프로그램 안에 _beginthreadex (...)를 사용하여 간단한 스레드를 만들었습니다. 내 응용 프로그램이 닫히지 않으면 (스레드를 명시 적으로 닫지 않고) 어떻게 될지 궁금합니다. 스레드 내의 모든 리소스가 자동으로 지워지나요? 나는 의심이있다. 그래서 응용 프로그램을 닫을 때 스레드를 종료하고 싶습니다. 가장 좋은 방법이 무엇인지 궁금하네요? _endthreadex를 사용하면 스레드 내부에서만 (!) TerminateThread (...)와 같은 작업 (무한 루프)이 작동하지 않는 것 같습니다. 조언이 있습니까?_beginthreadex() 끝내는 방법?

답변

0

메인 스레드가 종료되면 앱과 모든 리소스가 정리됩니다. 여기에는 다른 스레드 및 해당 자원이 포함됩니다.

TerminateThread에 대한 코드는 게시되었으므로 게시하십시오.

0

가장 간단한 방법은 트레드가 종료되어야하고 리소스를 해제하고 엔트리 포인트 기능을 종료 할 수 있도록 메시지를 스레드에게 보내는 것입니다 (또는 이벤트를 통해 표시하는 방법).

0

스레드를 닫으려면 _beginthreadex에서 반환 한 핸들로 CloseHandle()을 호출해야합니다.

스레드는 프로세스의 일부이므로 프로세스가 종료되면 스레드가 실행되고 운영 체제가 두 시스템의 소유권을 다시 시작하므로 모든 리소스가 해제됩니다.

끝점이있는 스레드를 미리주의하지 않으면 끝날 때 중간에있을 수 있습니다. 시스템이나 외부 리소스를 사용하고있는 중일 때는 파일이 공개되지만 펑키 한 상태 일 수 있습니다 (예 : 파일이 부분적으로 작성된 경우 등).

도 참조 http://www.bogotobogo.com/cplusplus/multithreading_win32A.php

참고하여 CloseHandle()를 만 _beginthreadex과는 _beginthread를 사용하지 않는 경우이다 사용. http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.90).aspx

+0

@MSalters 예, _beginthread 및 _endthread를 사용할 때 : _endthread는 자동으로 스레드 핸들을 닫습니다 (_endthreadex는 그렇지 않습니다). 따라서 _beginthread 및 _endthread를 사용할 때는 Win32 CloseHandle API를 호출하여 스레드 핸들을 명시 적으로 닫지 마십시오. 이 동작은 Win32 ExitThread API와는 다릅니다. '[MSDN] (http://msdn.microsoft.com/en-us/library/kdzttdcb(v=9090) .aspx) OP는 명시 적으로'_beginthreadex '라고 말했습니다. – kfsone

+0

흠, 그 MSDN 기사가 일치하지 않습니다. '_beginthread'와'_beginthreadex '가 다른 4 점을 나열하고'CloseHandle'을 호출 할 필요가 없습니다. 다행히도 Visual Studio는 CRT 소스와 함께 제공되며'threadex.c'는 실제로'CloseHandle'에 대한 호출을 포함하지 않습니다. – MSalters

1

주 스레드가 종료되면 다른 스레드가 파괴됩니다.

다른 스레드에서 핸들을 사용하여 기본 대기 시간을 설정하고 이벤트를 사용하여 메시지를 보내어 종료 신호를 보내는 것이 가장 좋습니다. 그런 다음 Main은 이벤트를 신호하고 다른 스레드가 수행중인 작업을 완료하고 정상적으로 종료 할 때까지 기다릴 수 있습니다. 물론 이것은 스레드가 이벤트를 주기적으로 검사하여 종료해야하는지 확인해야합니다.

관련 문제