Assistance would be great.
I am just trying to learn multi-threading and the example below should create 10 threads, set them to sleep for a random period of time, wait for them all to trigger they are finished. The ::WaitForMultipleObjects always returns WAIT_TIMEOUT.
Can someone explain to me why the ::WaitForMultipleObjects doesn't complete after all the threads are finished?
I am sure it is pretty simple for the experts and apologies if it is obvious.
Thanks
void CtestmultithreadView::OnGo()
{
AlgoParam param;
HANDLE startHandles[10];
HANDLE finishedHandles[10];
UINT seed = (unsigned)time( NULL );
srand( seed );
for( int i=0; i<10; i++ )
{
startHandles[i] = ::CreateEvent( NULL, FALSE, FALSE, NULL );
finishedHandles[i] = ::CreateEvent( NULL, FALSE, FALSE, NULL );
double r = ((double)rand()/RAND_MAX)*10000.0;
param.startHandle = startHandles[i];
param.finishedHandle = finishedHandles[i];
param.i = i;
param.interval = (DWORD)r;
CWinThread* wt = AfxBeginThread( AlgoController, ¶m, 0, 0, CREATE_SUSPENDED );
wt->m_bAutoDelete = TRUE;
wt->ResumeThread();
::SetEvent( startHandles[i] );
::Sleep(100);
}
DWORD waitResult;
ATLTRACE( _T("Waiting for multiple objects\n") );
waitResult = ::WaitForMultipleObjects( 10, finishedHandles, TRUE, 45000 );
if( waitResult==WAIT_TIMEOUT )
ATLTRACE( _T("WAIT_TIMEOUT\n") );
if( waitResult==WAIT_FAILED )
ATLTRACE( _T("WAIT_FAILED\n") );
if( waitResult==WAIT_OBJECT_0 )
ATLTRACE( _T("WAIT_OBJECT_0\n") );
if( waitResult==WAIT_ABANDONED_0 )
ATLTRACE( _T("WAIT_ABANDONED_0\n") );
}
UINT AlgoController( LPVOID pParam )
{
AlgoParam* param = (AlgoParam*)pParam;
int threadID = param->i;
DWORD interval = param->interval;
::WaitForSingleObject( param->startHandle, INFINITE );
ATLTRACE2( _T("Thread id : %d sleeping for %ld\n"), threadID, interval );
::Sleep( interval );
ATLTRACE2( _T("Thread id : %d finished\n"), threadID );
::SetEvent( param->finishedHandle );
return 0L;
}