具有CWinThread指针数组的WaitForMultipleObjects

Phi*_*l H 0 c++ winapi mfc multithreading

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

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);
Run Code Online (Sandbox Code Playgroud)

WaitForMultipleObjects总是返回WAIT_FAILED,并GetLastError产生6无效句柄.AfxBeginThread返回的测试不足以保证线程是成功创建的,并且句柄有效,或者在WaitForMultipleObjects调用之前句柄变得无效,我认为可以通过设置m_bAutoDelete来阻止它FALSE.

是否有更好的方法在多个线程创建时等待多个线程AfxBeginThread

请注意,它很好maxThreads=1.

Rom*_* R. 5

handles[0]指向具有一个有效句柄和可能跟随它的一些数据的东西.maxThreads相反,建议数组应该有一个接一个的两个句柄.因此错误.

这就是你想要的:

HANDLE handles[maxThreads];
//...
handles[threadId] = threads[threadId]->m_hThread;
//...
WaitForMultipleObjects(maxThreads, handles, ...
Run Code Online (Sandbox Code Playgroud)