Search code examples
cmultithreadingreturnbeginthread

How to get the return value of the first parameter _StartAddress of function _beginthread


I wanted to do something using multi-threading and all the stuff encapsulated in function foo .

filterThread = _beginthread (foo, 0,NULL) ;

and I wanted to let foo return value:

int foo()
{
    return iRet;
}

but the prototype of _beginthread _CRTIMP uintptr_t __cdecl _beginthread (_In_ void (__cdecl * _StartAddress) (void *), _In_ unsigned _StackSize, _In_opt_ void * _ArgList) shows that foo must be void which means cannot return value . Is there any way else i can do to let foo return value?


Solution

  • To get the return value aka exit code of thread:

    Call this function on thread's handle after it has finished,

    DWORD ExitCode;
    GetExitCodeThread(hThread, &ExitCode);
    

    As an example, consider using _beginthreadex instead,

    unsigned __stdcall foo( void* pArguments )
    {
        _endthreadex( 0 );
        return 0;
    } 
    
    int main()
    { 
        HANDLE hThread;
        unsigned threadID;
    
        hThread = (HANDLE)_beginthreadex( NULL, 0, foo, NULL, 0, &threadID );
    
        WaitForSingleObject( hThread, INFINITE );
    
        CloseHandle( hThread );
    }