SylixOS 线程取消处理流程

概述
取消一个线程要确保该线程能够释放其所持有的锁、分配的内存,使整个系统保持一致性。线程取消的途径有两种:异步取消和延时取消。

异步取消:被取消线程收到取消信号后,立即死亡。该线程缩持有的资源可能得不到释放,这是一种非安全的线程取消方式。

延时取消:系统默认取消方式,是一种比较安全的线程取消机制,被取消线程取消时,只是设置取消点(ptcbDel->TCB_bCancelRequest)为true,被取消线程继续运行,等到安全位置后进行取消操作。

取消点: 在使用延迟取消机制时,一个线程在可以被取消的地方定义取消点,当收到取消请求时,被取消的线程执行到取消点时退出,或者在一个取消点调用被阻塞时退出。

关键结构体
程序清单2.1 TCB结构体部分节选

typedef struct __lw_tcb {

...

??? LW_LIST_LINE????????? TCB_lineManage;????????? /? 内核管理用线表????????????? /

??? LW_LIST_RING????????? TCB_ringReady;?????????? /? 相同优先级就绪环??????????? /

???

??? LW_CLASS_WAKEUP_NODE? TCB_wunDelay;????? /? 等待节点??????????????????? /

#define TCB_ulDelay?????? TCB_wunDelay.WUN_ulCounter

...

#if (LW_CFG_EVENT_EN > 0) && (LW_CFG_MAX_EVENTS > 0)

??? LW_LIST_RING????????? TCB_ringEvent;????????? ???/? 事件等待队列表????????????? /

??? PLW_CLASS_EVENT?????? TCB_peventPtr;??????????? /? 等待事件指针????????????? ?/

??? PLW_LIST_RING??????? TCB_ppringPriorityQueue;????? /? 在 PRIORITY 队列位置???? */

??????????????????????????????????????????????? /? 由于删除线程时需要解等待链,/

?????????????????????????????????????????????? /? 这时需要确定队列位置??????? /

#endif

#if LW_CFG_COROUTINE_EN > 0

??? LW_CLASS_COROUTINE??? TCB_crcbOrigent;???????? /? 协程起源点????????????????? /

??? PLW_LIST_RING???????? TCB_pringCoroutineHeader;?? /? 协程首地址???????????????? /

#endif??????????????????????????????????????????? /? LW_CFG_COROUTINE_EN > 0???? /

...

??? volatile ULONG??????? TCB_ulCPUId;?????????? /? 如果正在运行, 表示运行 CPU? /

??? volatile BOOL???????? TCB_bIsCand;?????????? /? 是否在候选运行表中???????? ?/

#if LW_CFG_SMP_EN > 0

??? struct __lw_tcb????? TCB_ptcbWaitStatus;????????? /? 等待状态修改的目标线程????? */

??? PLW_LIST_LINE???????? TCB_plineStatusReqHeader;???? /? 等待修改本线程状态?????? /

??? LW_LIST_LINE????????? TCB_lineStatusPend;????????? /? 等待目标线程状态修改?? ????/

#endif?????????????????????????????????????????????? /? LW_CFG_SMP_EN????????????? /

...

??? PLW_EVENTSETNODE????? TCB_pesnPtr;????? /? 指向该线程等待????????????? /

...

#if LW_CFG_THREAD_CANCEL_EN > 0

??? BOOL????????????????? TCB_bCancelRequest;???? /? 取消请求??????????????????? /

??? INT?????????????????? TCB_iCancelState;???????? /? 取消状态??????????????????? /

??? INT?????????????????? TCB_iCancelType;????????? /? 取消类型??????????????????? /

#endif???????????????????????????????????????? /? LW_CFG_THREAD_CANCEL_EN???? /

...

#if LW_CFG_THREAD_DEL_EN > 0

??? struct __lw_tcb????? TCB_ptcbDeleteMe;?????? /? 要将本线程删除的 TCB??????? */

??? struct __lw_tcb????? TCB_ptcbDeleteWait;???????? /? 等待对方删除的 TCB????????? */

#endif???????????????????????????? ????????????????/? LW_CFG_THREAD_DEL_EN > 0??? /

??? UINT8???????????????? TCB_ucStackAutoAllocFlag;???? /? 堆栈是否有系统在堆中开辟?? /????????

??? PVOID???????????????? TCB_pvVProcessContext;?????? /? 进程上下文???????????????? /

...

} LW_CLASS_TCB;

程序清单2.2 等待队列

typedef union {

??? PLW_LIST_RING???????? WL_pringFifo;????????????????? /? 基于先入先出的等待队列?? /

??? PLW_LIST_RING???????? WL_pringPrio[__EVENT_Q_SIZE];? /? 基于优先级的等待队列?? /

} LW_UNION_WAITLIST;

typedef LW_UNION_WAITLIST *PLW_UNION_WAITLIST;

typedef struct {

??? LW_UNION_WAITLIST???? WQ_wlQ;??????????????? /? 等待队列??????????????????? /

??? UIN×××6??????????????? WQ_usNum;??????????????? /? 等待队列中的线程个数??????? /

} LW_CLASS_WAITQUEUE;

typedef LW_CLASS_WAITQUEUE *PLW_CLASS_WAITQUEUE;

程序清单2.3 事件集

typedef struct {???????????????????????????????????????????? /? 事件集??????????????????? /

??? LW_LIST_MONO???????? EVENTSET_monoResrcList;???? /? 空闲资源表?????????????? /

??? UINT8??????????????? EVENTSET_ucType;????????????? /? 类型????????????????????? /

??? PLW_LIST_LINE??????? EVENTSET_plineWaitList;??????? /? 指向第一个等待线程??????? /

??? ULONG??????????????? EVENTSET_ulEventSets;???????? /? 32 bit 事件位???????????? /

??? ULONG??????????????? EVENTSET_ulOption;?????????? /? 事件集选项??????????????? /

??? UIN×××6?????????????? EVENTSET_usIndex;???????????? /? 数组中的索引????????????? /

??? CHAR???????????????? EVENTSET_cEventSetName[LW_CFG_OBJECT_NAME_SIZE];

???????????????????????????????????????????????????????? /? 事件标志组名????????????? ?/

} LW_CLASS_EVENTSET;

typedef LW_CLASS_EVENTSET *PLW_CLASS_EVENTSET;

typedef struct {????????????????????????????????????????????? /? 事件集节点?????????????? /

??? LW_LIST_LINE???????? EVENTSETNODE_lineManage;???? /? 事件标志组管理表??????? /

???

??? PVOID???????? ???????EVENTSETNODE_ptcbMe;?????? /? 指向等待任务的TCB??????? /

??? PVOID??????????????? EVENTSETNODE_pesEventSet;?? /? 指向标志组??????????????? /

??? ULONG??????????????? EVENTSETNODE_ulEventSets;?? /? 标志组开始等待?????????? /

??? UINT8??????????????? EVENTSETNODE_ucWaitType;???? /? 等待类型???????????????? /

} LW_CLASS_EVENTSETNODE;

typedef LW_CLASS_EVENTSETNODE?? *PLW_CLASS_EVENTSETNODE;

typedef PLW_CLASS_EVENTSETNODE?? PLW_EVENTSETNODE;

流程
API_ThreadCancel函数流程:

? ? ? 图3.1 API_ThreadCancel函数

API_ThreadTestCancel函数流程:


图3.2 API_ThreadTestCancel函数

pthread_delete函数流程:


图3.3 pthread_delete函数

__threadDelete函数流程:


图3.4 __threadDelete函数

原文地址:http://blog.51cto.com/11620867/2178629

时间: 2024-11-10 13:09:50

SylixOS 线程取消处理流程的相关文章

android源码解析(二十)-->Dialog取消绘制流程

上几篇文章中我们分析了Dialog的加载绘制流程,也分析了Acvityi的加载绘制流程,说白了Android系统中窗口的展示都是通过Window对象控制,通过ViewRootImpl对象执行绘制操作来完成的,那么窗口的取消绘制流程是怎么样的呢?这篇文章就以Dialog为例说明Window窗口是如何取消绘制的. 有的同学可能会问前几篇文章介绍Activity的加载绘制流程的时候为何没有讲Activity的窗口取消流程,这里说明一下.那是因为当时说明的重点是Activity的加载与绘制流程,而取消绘

SylixOS BSP tick驱动流程

SylixOS BSP tick驱动流程 1. 开发环境 - 操作系统:SylixOS - 编程环境:RealEvo-IDE3.1 - 硬件平台:IMX6Q实验箱 2.技术实现 时钟节拍(clock tick)是特定的周期性中断.这个中断可以看做是系统心脏的脉动.时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,同时当任务等待事件发生时,提供等待超时的依据. 2.1 Tick的频率设置 Tick的频率需要根据具体的硬件性能来设置.频率越快,系统的额外开销也会越大.SylixOS中频率通

POSIX多线程--线程取消

1.三种取消状态Off                   禁用取消Deferred           推迟取消:在下一个取消点执行取消Asynchronous   异步取消:可以随时执行取消 int pthread_cancel(pthread_t thread) 2.推迟取消:在下一个取消点执行取消 Pthreads系统上的某些函数会被作为取消点,如pthread_testcancel,sleep,pthread_cond_wait等.线程调用pthread_cancel函数后,被取消线程

线程取消

一个线程可以调用pthread_cancel来取消另一个线程.被取消的线程需要被join来释放资源.被取消的线程的返回值为PTHREAD_CANCELED 有关线程的取消,一个线程可以为如下三个状态:    1) 可异步取消:一个线程可以在任何时刻被取消.    2) 可同步取消:取消的请求被放在队列中,直到线程到达某个点,才被取消.    3) 不可取消:取消的请求被忽略.    4) 默认状态下,线程是可同步取消的. 调用pthread_setcanceltype来设定线程取消的方式:pth

(转载)Linux 线程取消(Pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

pthread_setcanceltype 线程取消

取消线程: (1)一个线程可以调用pthread_cancel来取消另一个线程.    (2)被取消的线程需要被join来释放资源.    (3)被取消的线程的返回值为PTHREAD_CANCELED 有关线程的取消,一个线程可以为如下三个状态:          (1)可异步取消:一个线程可以在任何时刻被取消.          (2)可同步取消:取消的请求被放在队列中,直到线程到达某个点,才被取消.         (3)不可取消:取消的请求被忽略.            默认状态下,线程是

SylixOS线程堆栈大小浅析

目录 1. SylixOS线程.线程栈介绍    1 1.1    线程的介绍    1 1.2    线程栈的介绍    1 2. SylixOS线程栈大小的分配    1 2.1    线程.线程栈相关属性的设置    2 2.2    线程栈大小    2 2.3    线程堆栈警戒区    3 3. 总结    5 4. 参考资料    5 SylixOS线程.线程栈介绍 SylixOS是多线程操作系统,系统能够同时创建多个线程,具体最大线程数量取决于系统内存的大小以及编译SylixOS

线程取消 (pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

.net 多线程之线程取消

1 //线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) 2 //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 3 //线程不能别人终止,只能自己干掉自己,延迟是少不了的 4 //CancellationTokenSource可以在cancel后,取消没有启动的任务 5 CancellationTokenSource cts = new CancellationTokenSource();//bool值 6 for (i