概述

线程结束意味着线程生命周期终止。线程结束包括线程取消线程退出线程删除 3 种情况。

API 说明
API_ThreadDelete 线程删除函数。
API_ThreadForceDelete 线程强制删除函数。
API_ThreadExit 线程自行退出。
exit 内核线程或者进程退出
_exit 内核线程或者进程退出, 不执行 atexit 安装的函数
atexit 进程退出时执行的操作. (当使用多进程模式时, 将会使用 vp patch 重定向)

线程删除

线程删除是将线程的资源返还给操作系统,删除后的线程不能再被调度。

/*********************************************************************************************************
** 函数名称: API_ThreadDelete
** 功能描述: 线程删除函数。
** 输 入  :
**           pulId         句柄
**           pvRetVal      返回值   (返回给 JOIN 的线程)
** 输 出  :
*********************************************************************************************************/
ULONG  API_ThreadDelete (LW_OBJECT_HANDLE  *pulId, PVOID  pvRetVal)
/*********************************************************************************************************
** 函数名称: API_ThreadForceDelete
** 功能描述: 线程强制删除函数
** 输 入  :
**           pulId         句柄
**           pvRetVal      返回值   (返回给 JOIN 的线程)
** 输 出  :
*********************************************************************************************************/
ULONG  API_ThreadForceDelete (LW_OBJECT_HANDLE  *pulId, PVOID  pvRetVal)

调用上面的两个函数可使线程结束,并释放线程资源,由于 SylixOS 支持进程,所以删除线程只能是同一个进程中的线程,而且主线程只能由其自己来删除。

主动删除其他正在执行的线程,可能造成其加锁的资源得不到释放,或者原子操作被打断,所以除非确保安全,否则 SylixOS 以及任何其他操作系统都不推荐直接使用线程删除函数调用。在应用程序设计时,应考虑使用“请求”删除方式,当线程自己发现无事可做或者被请求删除时,由线程自己删除自己(线程退出)。

线程退出

线程退出就是线程自己调用线程删除函数,以便安全的收回线程资源。

/*********************************************************************************************************
** 函数名称: API_ThreadExit
** 功能描述: 线程自行退出。
** 输 入  : pvRetVal       返回值   (返回给 JOIN 的线程)
** 输 出  : 成功返回 ERROR_NONE,失败返回错误号;
*********************************************************************************************************/
ULONG  API_ThreadExit (PVOID  pvRetVal)
/*********************************************************************************************************
** 函数名称: exit
** 功能描述: 内核线程或者进程退出
** 输 入  : iCode         返回值
** 输 出  :
*********************************************************************************************************/
void  exit (int  iCode)
/*********************************************************************************************************
** 函数名称: _exit
** 功能描述: 内核线程或者进程退出, 不执行 atexit 安装的函数
** 输 入  : iCode         返回值
** 输 出  :
*********************************************************************************************************/
void  _exit (int  iCode)
/*********************************************************************************************************
** 函数名称: atexit
** 功能描述: 进程退出时执行的操作. (当使用多进程模式时, 将会使用 vp patch 重定向)
** 输 入  : iCode         返回值
** 输 出  :
*********************************************************************************************************/
int  atexit (void (*func)(void))

线程取消

线程取消的方法是向目标线程发送 Cancel 信号,但如何处理 Cancel 信号则由目标线程自己决定,需要注意的是,线程取消是一个复杂的过程,需要考虑资源的一致性问题。

/*********************************************************************************************************
** 函数名称: API_ThreadTestCancel
** 功能描述: 检测线程是否有请求取消标志, 当条件满足时自动取消.
** 输 入  :
** 输 出  :
*********************************************************************************************************/
VOID  API_ThreadTestCancel (VOID)
/*********************************************************************************************************
** 函数名称: API_ThreadCancel
** 功能描述: 取消一个指定的线程
** 输 入  : pulId     线程句柄
** 输 出  : ERROR_NONE or ESRCH
*********************************************************************************************************/
ULONG  API_ThreadCancel (LW_OBJECT_HANDLE  *pulId)
/*********************************************************************************************************
** 函数名称: API_ThreadSetCancelState
** 功能描述: 设置取消线程是否使能,
** 输 入  : iNewState                     更新的状态
**           piOldState                    先早的状态
** 输 出  : EINVAL                        参数错误
**           0
*********************************************************************************************************/
ULONG   API_ThreadSetCancelState (INT  iNewState, INT  *piOldState)
/*********************************************************************************************************
** 函数名称: API_ThreadSetCancelType
** 功能描述: 设置当前线程被动取消时的动作,
**           可以为 PTHREAD_CANCEL_ASYNCHRONOUS or PTHREAD_CANCEL_DEFERRED
** 输 入  :
**           iNewType           新类型
**           piOldType          先早类型
** 输 出  : ERRNO
*********************************************************************************************************/
INT  API_ThreadSetCancelType (INT  iNewType, INT  *piOldType)

SylixOS中的线程【5】--- 线程结束相关推荐

  1. C++:多线程中的小白(2)线程启动、结束、创建线程、join、detach

    目录 一.范例演示:线程运行的开始和结束 二.其他创建线程的手法 一.范例演示:线程运行的开始和结束 (1)thrad (2)join()函数 (3)detach()函数 (4)joinable()函 ...

  2. python 强制结束线程_在python中实现强制关闭线程的示例

    Python 如何强制关闭线程过去只可以用来回忆,别沉迷在阴影中,否则永远看不清前面的路. Python用sleep停止一个线程的运行,而不影响主线程的运行,案例代码如下: from threadin ...

  3. java 如何结束线程_java中,如何安全的结束一个正在运行的线程?

    问题 Java中提供了很多调度线程的方法,上一节介绍了其中一种控制线程的方法:如何等待一个线程结束.那么如果不希望等待线程结束,而是根据问题的需要随时都要中断线程使其结束,这种对线程的控制方法该如何实 ...

  4. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  5. 第二节 线程启动、结束、创建线程多个方法、join()、detach()

    1.范例演示线程运行的开始和结束 可执行程序运行起来,生成一个进程,该进程所属的主线程开始自动运行. #include <iostream> #include <vector> ...

  6. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  7. java线程 yield_Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  8. Java中的进程与线程

    2019独角兽企业重金招聘Python工程师标准>>> Java中的进程与线程 概念 进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 "资源&qu ...

  9. 浅谈线程池(中):独立线程池的作用及IO线程池

    在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...

最新文章

  1. SQLer:无需编程语言即可将SQL查询转换为RESTful API的工具
  2. 数据库副本的自动种子设定(自增长)
  3. 评估数据源是否回溯_IAI Trade:蒙特卡洛模拟在回溯检验中的应用
  4. sql语句的执行过程和优化
  5. 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
  6. torch.randn
  7. Systemview5安装的问题:the license for this version of systemview has expired......
  8. Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得...
  9. js实现全国省份下拉
  10. 第三方支付清算的信息流与资金流
  11. c语言中人脸磨皮算法,人脸磨皮算法
  12. 《Gpu Gems》《Gpu Pro》《Gpu Zen》系列读书笔记
  13. 报刊订阅管理系统数据库
  14. dw怎么在框架中加入网页_DW中制作框架网页.ppt
  15. 神州数码:我国市民卡发展之路探讨
  16. 云桌面-ThinVirt3-EXP操作手册(一)云桌面系统安装
  17. IntelliJ IDEA启动tomcat报错:Disconnected from server
  18. 风控策略分析师日常--代码、数据、策略
  19. ubuntu14.04使用reaver跑pin码
  20. HTML播放华为云视频流,华为云点播服务视频管理功能强大,上云就是省心

热门文章

  1. Reset 数据包导致的灵异事件
  2. MATLAB实现假设检验-初学者必备
  3. DoraCloud云教室实践
  4. 深思iOS应用加固方案
  5. C:希尔排序(C语言)
  6. 【千锋】网络安全学习笔记(五)
  7. 关于 MySQL 锁 你知道多少
  8. CF121A Lucky Sum(codeforces C++)
  9. python中列表中的字符串转换成数字
  10. TM4C123GLaunchPad教程三_外部中断