2009-03-19 12 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 *にアクセスしたりすることを避けるためです。