【问题标题】:Stopping a thread in Win32/MFC在 Win32/MFC 中停止线程
【发布时间】:2010-10-14 08:47:50
【问题描述】:

我正在阅读一些与线程相关的代码,并找到了这段代码:

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

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

【问题讨论】:

    标签: c++ multithreading winapi mfc


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2011-10-27
        • 2013-12-07
        • 1970-01-01
        相关资源
        最近更新 更多