locked
FAQ:2.16 我们应该如何结束一个线程,我们可以使用TerminateThread来停止一个线程吗? RRS feed

  • 问题

  • 2.16 我们应该如何结束一个线程,我们可以使用TerminateThread来停止一个线程吗?
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 3:07

答案

  • “中止”( terminate)一个线程并不是一个好主意。停止或完全的退出一个线程反而更安全。MSDN文档在TerminateThread API中说到TerminateThread是一个很危险的函数,只能在很极端的情况下才可以使用。只有当你确切知道目标线程是做什么的,并且你可以控制所有目标线程在结束时可能会运行到的代码,这时候才可以调用TerminateThread。例如,TerminateThread会产生如下问题:

    ·           如果目标线程有一个临界区(critical section),这临界区将不会被释放。

    ·           如果目标线程在堆里分配了内存,堆锁(heap lock)将不会被释放。

    ·           如果目标线程在结束时调用了某些kernel32,这样在线程的过程中的kernel32状态会不一致。

    ·           如果目标线程正操作着一个共享库的全局状态,这个库的状态会被破坏,影响到其他的这个库的使用者。

    也许结束一个线程最可靠的方法就是确定这个线程不休眠无限期的等待下去。一个支持线程被要求停止,它必须定期的检查看它是否被要求停止或者如果它在休眠的话看它是否能够被唤醒。支持这两个情况最简单的的方法就是使用同步对象,这样应用程序的线程和问题中的线程能互相沟通。当应用程序希望关闭线程时,只要设置这个同步对象,等待线程退出。之后,线程把这个同步对象作为它周期性监测的一部分,定期检查,或者如果这个同步对象的状态改变的话,唤醒它,还可以执行清空和退出线程函数。

    相关英文论坛的帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/67fe193a-ba67-454c-b19d-81ee4168818c


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 3:08