【Windows核心编程】Windows核心编程 -- 线程基础

发表于:2012-12-04 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小田    来源:51Testing软件测试网采编

  四、终止运行线程

  线程可以通过以下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;

52/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号