基础:
1. Windows线程如何结束?
安全方法:ExitThread
强制方法:TerminateThread
共性:
线程结束时都会将线程状态设置为signaled,线程结束状态由STILL_ACTIVE修改为退出码(dwExitCode)。
个性:
安全方法将在结束线程时同时释放线程的栈和线程连接的DLL;
强制方法不进行上述清理工作,是危险的方法,不推荐使用,并且需要与THREAD_TERMINATE标志联合使用。
2. 工作者线程如何结束?
工作者线程是MFC特有的名词,它是MFC将普通Windows线程进行包装后的结果,所以最终工作者线程的结束也要归结到1中提到的两种方法。线程结束工作由全局函数AfxEndThread完成,控制函数执行完毕后,框架会自动调用该函数结束线程。或者在控制函数的执行过程中显示的调用该函数结束线程,调用者必须是待结束的线程本身。
3. 工作者线程对象合适删除?
工作者线程对象的删除是MFC份内或称其为编译器级的工作,而工作者线程的结束归根结底是操作系统完成的工作,两者有区别。
CWinThread类有一成员变量m_bAutoDelete,若该变量为“TRUE”时,AfxEndThread将调用CWinThread::Delete删除线程对象;相反,设为“FALSE”不会删除,需要编程者手动删除。
实战:
1. 什么时候不设置为自动删除线程对象?
线程结束后,可能还有一些与线程有关的句柄(它们映射的对象是线程对象的成员变量)未关闭以进行额外的工作,如同步,此时需要根据程序需要手动删除对象。
2. 用户如何通知线程结束?
在线程对象内设置CEvent成员变量,当事件被置位时控制函数跳出循环返回,线程结束。
3. 多个线程如何一次关闭?
串行方法:对每线程依次完成通知结束、等待线程结束、删除对象的工作,效率低;
并行方法:先通知所有线程,等待全部线程退出后,再统一完成删除工作,效率高。
2008年11月10日星期一
订阅:
博文评论 (Atom)
没有评论:
发表评论