四、终止运行线程

  线程可以通过以下4种方法来终止运行:

  线程函数返回(这是强烈推荐的);

  线程通过ExitThread 函数“杀死”自己(应避免);

  同一个进程或另一个进程中的线程调用TerminateThread 函数(应避免);

  包含线程的进程终止运行(应避免);

  五、线程函数返回

  设计线程函数时,应该确保在我们希望线程终止运行时,让它们返回。这是保证线程的所有资源被正确清理的方式。让线程函数返回,可以确保一下正确地应用程序权利工作都得以执行:

  线程函数中创建的所有C++对象都通过其析构函数被正确销毁;

  操作系统正确释放线程栈使用的内存;

  操作系统把线程的退出代码(在线程的内核对象中维护)设为线程函数的返回值;

  系统减少线程的内核对象的使用计数;

  六、ExitThread函数

  VOID ExitThread(DWORD dwExitCode);

  该函数将终止线程的执行,并导致操作系统清理该线程使用的所有系统资源。但是你的C/C++资源(如C++类对象)不会被销毁。所以更好的做法是直接从线程函数返回,不要自己调用 ExitThread 。

  ExitThread 是Windows用于“杀死”线程的函数,如果要写C/C++代码,不要调用 ExitThread 。相反,应该使用C++运行库函数_endthreadex 。 如果使用的不是Microsoft的C++编译器,那么编译器供应商应该提供它们自己的 ExitThread 替代函数。 不管这个替代函数是什么,都必须使用它。

  七、TerminateThread函数


BOOL TerminateThread(
             HANDLE hThread,
             DWORD dwExitCode);


  TerminateThread 是异步函数 ,ExitThread 函数来终止线程,线程的堆栈会被销毁,而 TerminateThread ,除非拥有此线程的进程终止运行,否则系统不会销毁这个线程的堆栈。

  八、线程终止运行时

  一个线程终止时,系统会一次执行以下操作:

  线程拥有的所有用户对象句柄会被释放;

  线程的退出代码从STILE_ACTIVE变为传给ExitThread或TerminateThread函数的代码;

  线程内核对象的状态变为已触发状态;

  如果线程是进程中的后一个活动线程,系统认为进程也终止了;

  线程内核对象的使用计数递减1;