Суть этого:
Для завершения собственного процесса Win32 должно быть выполнено одно из двух условий:
- Кто-то вызывает ExitProcess или TerminateProcess.
- Все потоки выходят (возвращаясь из их ThreadProc (включая WinMainEntryPoint, который является первым потоком, созданным окнами)), закрываются (путем вызова ExitThread) или завершаются (кто-то вызывает TerminateThread).
(Первое условие фактически совпадает со вторым: ExitProcess и TerminateProcess, как часть их очистки, оба вызывают TerminateThread для каждого потока в процессе).
Время выполнения c накладывает различные условия: чтобы завершить работу приложения C / C ++, вы должны либо:
- возврат из основного (или WinMain).
- вызов выхода ()
Вызов exit () или возврат из main () приводит к тому, что c-runtime вызывает ExitProcess (). Именно так выходят приложения c & c ++ без очистки их потоков. Я лично считаю, что это плохо.
Тем не менее, нетривиальные процессы Win32 никогда не могут завершиться, потому что многие совершенно, в противном случае разумные, подсистемы Win32 создают рабочие потоки. winsock, ole и т. д. И не предоставляют никакого способа самопроизвольно закрыть эти потоки.