我正在阅读一些与线程相关的代码并找到了这段代码:
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);
}
我的问题,为什么需要重复的句柄?我们不能直接等待原来的线程句柄吗?它会以某种方式变得无效吗?
答案 0 :(得分:8)
AfxBeginThread返回CWinThread*
,MFC假定它将管理与该线程关联的句柄。
因此,为了直接安全地使用句柄,你需要复制它,否则当线程结束时MFC可能在你进入WaitForSingleObject调用之前关闭了句柄。
如果您直接使用win32 CreateThread API,那么您当然可以直接在返回的句柄上等待。
答案 1 :(得分:2)
CWinThread的m_hThread成员仅在销毁CWinThread对象时关闭。如果m_bAutoDelete设置为TRUE,则对象将自行删除。线程将在工作器函数或消息循环等完成后自行删除,请参阅_AfxThreadEntry。句柄重复的原因是为了避免使用无效句柄或访问无效的CWinThread *,如果线程退出并在调用stop()之前被销毁。