在Win32 / MFC中停止一个线程

时间:2009-03-19 17:04:56

标签: c++ multithreading winapi 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);
}

我的问题,为什么需要重复的句柄?我们不能直接等待原来的线程句柄吗?它会以某种方式变得无效吗?

2 个答案:

答案 0 :(得分:8)

AfxBeginThread返回CWinThread*,MFC假定它将管理与该线程关联的句柄。

因此,为了直接安全地使用句柄,你需要复制它,否则当线程结束时MFC可能在你进入WaitForSingleObject调用之前关闭了句柄。

如果您直接使用win32 CreateThread API,那么您当然可以直接在返回的句柄上等待。

答案 1 :(得分:2)

CWinThread的m_hThread成员仅在销毁CWinThread对象时关闭。如果m_bAutoDelete设置为TRUE,则对象将自行删除。线程将在工作器函数或消息循环等完成后自行删除,请参阅_AfxThreadEntry。句柄重复的原因是为了避免使用无效句柄或访问无效的CWinThread *,如果线程退出并在调用stop()之前被销毁。