Остановка потока в Win32 / 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);
}

На мой вопрос, зачем нужен дублирующий дескриптор? Разве мы не можем напрямую ждать исходного дескриптора потока? Это как-то стало недействительным?


person Naveen    schedule 19.03.2009    source источник


Ответы (2)


AfxBeginThread возвращает CWinThread*, и MFC предполагает, что он будет управлять дескриптором, связанным с потоком.

Таким образом, чтобы безопасно использовать дескриптор напрямую, вам необходимо продублировать его, иначе, когда поток завершится, MFC может закрыть дескриптор до того, как вы перейдете к вызову WaitForSingleObject.

Если вы работали напрямую с Win32 CreateThread API, вы, безусловно, могли бы ждать непосредственно возвращенного дескриптора.

person Rob Walker    schedule 19.03.2009

Член m_hThread класса CWinThread закрывается только при уничтожении объекта CWinThread. Объект удалит себя, если для m_bAutoDelete установлено значение TRUE. Поток удалит себя после завершения своей рабочей функции или цикла сообщений и т. Д., См. _AfxThreadEntry. Причина дублирования дескриптора состоит в том, чтобы избежать использования недопустимого дескриптора или доступа к недопустимому CWinThread *, если поток завершается и уничтожается до вызова stop ().

person adzm    schedule 19.03.2009