Остановка потока в Win32 / MFC - PullRequest
3 голосов
/ 19 марта 2009

Я читал код, связанный с многопоточностью, и нашел этот кусок кода:

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);
}

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

Ответы [ 2 ]

8 голосов
/ 19 марта 2009

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

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

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

2 голосов
/ 19 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...