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*