> Процесс завершается, когда завершается его главный поток. > Остальные - да, завершаются принудительно.
Это не винда прибивает "лишние" потоки, а C-шный рантайм.
Вот пример из VC.Net 2003:
int mainCRTStartup(
void
)
{
// [skipped]
__initenv = _environ;
mainret = main(__argc, __argv, _environ);
if ( !managedapp )
exit(mainret);
_cexit();
// [skipped]
}
void __cdecl _cexit (
void
)
{
doexit(0, 0, 1); /* full term, return to caller */
}
static void __cdecl doexit (
int code,
int quick,
int retcaller
)
{
// [skipped]
__crtExitProcess(code);
}
void __cdecl __crtExitProcess (
int status
)
{
HMODULE hmod;
PFN_EXIT_PROCESS pfn;
hmod = GetModuleHandle("mscoree.dll");
if (hmod != NULL) {
pfn = (PFN_EXIT_PROCESS)GetProcAddress(hmod, "CorExitProcess");
if (pfn != NULL) {
pfn(status);
}
}
/*
* Either mscoree.dll isn't loaded,
* or CorExitProcess isn't exported from mscoree.dll,
* or CorExitProcess returned (should never happen).
* Just call ExitProcess.
*/
ExitProcess(status);
}
---
Обычно же на самом верху у потоков лежит что то типа
kernel32!BaseProcessStart+0x23
в котором в свою очередь находится обычный
7c816d4f 50 push eax
7c816d50 e8545fffff call kernel32!ExitThread (7c80cca9)
---
И таки да. Все потоки равноправны. Процесс уничтожается после завершения последнего потока.
|