菜单
  

    ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作

    终止线程两个函数:ExitThread() 和 TerminateThread()

    若要终止线程的运行,可以使用下面四种的方法:

    线程函数退出循环来返回   (最佳方法 )。

    通过调用ExitThread 函数,线程将自行撤消(尽量不要使用这种方法 )。

    同一个进程或另一个进程中的线程调用TerminateThread 函数(最好避免使用这种方法 )。

    该线程的主进程终止运行(避免使用 )。

    下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。

    1.线程函数返回

    始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是

    确保所有线程资源被正确地清除的唯一办法。

    如果线程能够返回,就可以确保下列事项的实现:

    a) 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。

    b)操作系统将正确地释放线程堆栈使用的内存。

    c)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。

    d)系统将递减线程内核对象的使用计数。

    2.ExitThread 函数

    可以让线程调用ExitThread 函数,以便强制线程终止运行:

    该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消。由于这个原因,最好从线程函数返回,而不是通过调用ExitThread 来返回。

    当然,可以使用ExitThread  的dwExitThread 参数告诉系统将线程的退出代码设置为什么。ExitThread 函数并不返回任何值,因为线程已经终止运行,不能执行更多的代码。

    注意终止线程运行的最佳方法是让它的线程函数返回。但是,如果使用本节介绍的方法,应该知道ExitThread 函数是Windows用来撤消线程的函数。如果编写C/C++代码,那么决不应该调用ExitThread 。应该使用Visual C++运行期库函数_endthreadex。如果不使用Microsoft的Visual C++编译器,你的编译器供应商有它自己的ExitThread 的替代函数。不管这个替代函数是什么,都必须使用。本章后面将说明_endthreadex的作用和它的重要性。源1自37518.论~文'网·www.751com.cn

    3.TerminateThread 函数

    调用TerminateThread 函数也能够终止线程的运行:

    与ExitThread 不同,ExitThread 总是撤消调用的线程,而TerminateThread 能够撤消任何线程。hThread参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为dwExitThread 参数传递的值。同时,线程的内核对象的使用计数也被递减。

    注意TerminateThread 函数是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。如果需要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数,传递线程的句柄。

    设计良好的应用程序从来不使用这个函数,因为被终止运行的线程收不到它被撤消的通知。线程不能正确地清除,并且不能防止自己被撤消。注意当使用返回或调用ExitThread 的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread ,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。Microsoft故意用这种方法来实现TerminateThread 。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。此外,当线程终止运行时, DLL通常接收通知。如果使用Terminate Thread 强迫线程终止,DLL就不接收通知,这能阻止适当的清除(详细信息参见第20章)。

  1. 上一篇:TerminateThread方法强烈不建议使用
  2. 下一篇:yuojizz是什么意思
  1. spinlock和mutex的区别

  2. explicit c++中的作用和用法

  3. TerminateThread方法强烈不建议使用

  4. request.getcontextpath()作用,放在哪,指针为空

  5. 简述进程和线程的区别联系

  6. Bootstrap的OpenGL人体模型仿真

  7. 友谊质量调查问卷表

  8. 上市公司债务税盾文献综述和参考文献

  9. 多智能体系统一致性问题研究

  10. MATLAB动车组列车牵引变流...

  11. 小学课堂教学效率国内外研究现状和参考文献

  12. 跨国企业全球营销策略的市场定位调查

  13. PLC启闭机液压系统设计及其故障诊断

  14. 淮安乐天玛特连锁超市4P营销策略分析

  15. PLC焊机电气控制系统设计开题报告

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回