我有一个通过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
时可以正常使用。
答案 0 :(得分:5)
handles[0]
指向具有一个有效句柄且某些数据可能跟随它的内容。 maxThreads
反而建议数组应该有一个接一个的两个句柄。因此错误。
这就是你想要的:
HANDLE handles[maxThreads];
//...
handles[threadId] = threads[threadId]->m_hThread;
//...
WaitForMultipleObjects(maxThreads, handles, ...