我正在阅读一些与线程相关的代码,并发现了这段代码:
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返回a CWinThread*
,MFC假定它将管理与线程关联的句柄.
因此,为了直接安全地使用句柄,您需要复制它,否则当线程结束时,MFC可能在您进入WaitForSingleObject调用之前关闭了句柄.
如果您直接使用win32 CreateThread API,那么您当然可以直接在返回的句柄上等待.