2012-08-23 3 views
0

배열에 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_bAutoDeleteFALSE으로 설정하여 방지 할 수 있다고 생각했습니다.

AfxBeginThread을 만들 때 여러 스레드를 기다리는 더 좋은 방법이 있습니까?

maxThreads=1 일 때 괜찮습니다.

답변

5

handles[0]은 유효한 핸들 하나와 그 뒤에 오는 일부 데이터를 가리 킵니다. maxThreads 대신에 그 배열에는 두 개의 핸들이 차례로 있어야한다고 제안합니다. 따라서 오류.

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

이 아, 그것을 가지고 :

이는 대신 원하는 것입니다. 핸들 포인터의 배열이 좋지 않은 배열을 처리하기에 좋다. 고맙습니다. –

관련 문제