65.9K
CodeProject is changing. Read more.
Home

Is it mandatory to call _endthreadex() in your thread function?

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3 votes)

Sep 6, 2011

CPOL
viewsIcon

22971

Do you really need an explicit call to _endthreadex() in your thread function created using _beginthreadex()

I have often seen the thread functions written like the one below:
DWORD WINAPI MyThreadProc( LPVOID lpParam )
{
    DoSomeGreatOperationsHere();
    _endthreadex( 0 );  // This is the thing in QUESTION!!!
    return 0; // This part will never be executed, as _endthreadex() calls // ExitThread() with the value passed to _endthreadex()
}
Do we really require to call _endthreadex() in the threads created using _beginthreadex()? A big NO is the answer!! and for that matter you don't need a call to ExitThread() too. _beginthreadex() function actually allocates and initializes the per thread data required by the CRT and calls CreateThread() passing a stub function in CRT as the entrypoint for the thread. This stub function will call your actual thread function(in this case, MyThreadProc) and when your thread function returns, the stub function ensures that it calls _endthreadex() passing the value returned from the thread function. Again in _endthreadex(), the per thread data allocated will be released and ExitThread() will be called passing the value received in _endthreadex(). Reference: threadex.c & thread.c in CRT Source. Please be free to ask your queries, if any. :)