배열에 CWinThread
포인터를 저장하는 AfxBeginThread
을 통해 스레드를 생성하는 루프가 있습니다. 각 반복마다 스레드가 null이 아닌지 확인하고 스레드의 핸들을 다른 배열에 저장합니다.CWinThread 포인터 배열을 가진 WaitForMultipleObjects
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 호출 전에 핸들이 무효화되는 것을 보장하기에 불충분합니다. 이는 m_bAutoDelete
을 FALSE
으로 설정하여 방지 할 수 있다고 생각했습니다.
AfxBeginThread
을 만들 때 여러 스레드를 기다리는 더 좋은 방법이 있습니까?
maxThreads=1
일 때 괜찮습니다.
이 아, 그것을 가지고 :
이는 대신 원하는 것입니다. 핸들 포인터의 배열이 좋지 않은 배열을 처리하기에 좋다. 고맙습니다. –