C++ 在Win32/MFC中停止线程

C++ 在Win32/MFC中停止线程,c++,multithreading,winapi,mfc,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::st

我正在阅读一些与线程相关的代码,发现了以下代码:

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

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

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

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


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

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