2009-03-19 5 views
3

좀 스레딩 관련 코드를 읽고 코드의이 작품을 찾았습니다/MFC는

MyThread::start() 
{ 
    //Create a thread 
    m_pThread = AfxBeginThread(/*some parameters*/) 

    //Create a duplicate handle for the created thread 
    m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/) 
} 

MyThread::stop() 
{ 
    //Set some variables so that the thread comes out of its run() function 
    WaitForSingleObject(m_hDuplicateHandle, defaultTimeout); 

    CloseHandle(m_hDuplicateHandle); 
} 

내 질문, 중복 핸들이 필요합니다 왜? 원래 스레드 핸들에서 직접 대기 할 수는 없습니까? 어떻게 든 무효가됩니까?

답변

8

AfxBeginThread는 CWinThread*을 반환하며 MFC는 스레드와 관련된 핸들을 관리한다고 가정합니다.

그래서 안전하게 직접 핸들을 사용하려면 복제해야합니다. 그렇지 않으면 스레드가 종료 될 때 WaitForSingleObject 호출을 받기 전에 MFC가 핸들을 닫았을 수 있습니다.

win32 CreateThread API로 직접 작업하는 경우 확실히 반환 된 핸들을 직접 기다릴 수 있습니다.

2

CWinThread의 m_hThread 멤버는 CWinThread 개체를 파괴 할 때만 닫힙니다. m_bAutoDelete가 TRUE로 설정된 경우 개체가 삭제됩니다. 스레드는 작업자 함수 또는 메시지 루프 등이 완료된 후에 자체를 삭제합니다. _AfxThreadEntry를 참조하십시오. 핸들이 복제되는 이유는 스레드가 종료되어 stop()이 호출되기 전에 유효하지 않은 핸들을 사용하거나 잘못된 CWinThread *에 액세스하는 것을 피하기 위해서입니다.

관련 문제