On Win32 a process terminates normally when ALL of its threads have
exited. It does not necessarily terminate when the 'main' thread
terminates.

However, Microsoft's C runtime makes an explicit call to ExitProcess
after the return from main(). From crt\src\crt0.c:

        int mainret;
        ...
        mainret = main (__argc, __argv, _environ);
        exit (mainret);

When CreateThread returns success the thread is guaranteed to have been
created (thus preventing the process from terminating) but it may not
have received a timeslice yet.

The following C program demonstrates this:

#include <windows.h>

DWORD WINAPI ThreadProc (LPVOID *lpv)
{
        Sleep (10 * 1000);
        return 0;
}

int mymain ()
{
        DWORD dwThreadId;
        CreateThread (NULL, 0, ThreadProc, NULL, 0, &dwThreadId);
        return 0;
}

C:\> cl thread.c /link /nodefaultlib /subsytem:console /entry:mymain
kernel32.lib

NOTE: the /link flags cause the process entry to be at the mymain
function thus bypassing the C runtime. The /subsystem switch causes the
shell (CMD.EXE) to run the process in the forground (ie, in unix terms,
without a trailing '&')

HTH.
Piers.

_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to