具有CWinThread指针数组的WaitForMultipleObjects

时间:2012-08-23 11:48:29

标签: c++ multithreading winapi mfc

我有一个通过AfxBeginThread生成线程的循环,它将CWinThread指针存储在一个数组中。在每次迭代中,我检查线程是否为空并将线程的句柄存储在另一个数组中。

const unsigned int maxThreads = 2;
CWinThread* threads[maxThreads];
HANDLE* handles[maxThreads];
for(unsigned int threadId=0; threadId < maxThreads; ++threadId)
{
    threads[threadId] = AfxBeginThread(endToEndProc, &threadId,
                                            0,0,CREATE_SUSPENDED);
    if(threads[threadId] == NULL) 
    {
        // die carefully
    }
    threads[threadId]->m_bAutoDelete = FALSE;
    handles[threadId] = &threads[threadId]->m_hThread;
    ::ResumeThread(handles[threadId]);
}

DWORD result = ::WaitForMultipleObjects(maxThreads, handles[0], 
                                            TRUE, 20000*maxThreads);

WaitForMultipleObjects始终返回WAIT_FAILED,而GetLastError会因无效句柄而产生6。对AfxBeginThread返回的测试不足以保证线程是成功创建的,并且句柄有效,或者在WaitForMultipleObjects调用之前句柄变为无效,我认为可以通过设置{{1}来阻止它} m_bAutoDelete

FALSE创建多个线程时,有没有更好的方法等待多个线程?

请注意,AfxBeginThread时可以正常使用。

1 个答案:

答案 0 :(得分:5)

handles[0]指向具有一个有效句柄且某些数据可能跟随它的内容。 maxThreads反而建议数组应该有一个接一个的两个句柄。因此错误。

这就是你想要的:

HANDLE handles[maxThreads];
//...
handles[threadId] = threads[threadId]->m_hThread;
//...
WaitForMultipleObjects(maxThreads, handles, ...