前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Task之任务的删除

Task之任务的删除

作者头像
Taishan3721
发布2019-07-10 15:23:45
8860
发布2019-07-10 15:23:45
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

今天我们来看看VxWorks系统里如何删除任务。

与任务相关的API由系统库taskLib提供。

正常情况下,任务执行完自己的最后一条语句后,就主动退出了。不需要做什么额外操作。

不过任务也可以被动态删除。相关的API有

taskExit()会终止当前任务,并删除任务的Stack与TCB。事实上,执行完最后一条语句时,就会自动调用taskExit()。也就是说一般情况下,代码中没必要显式的调用taskExit()。

exit()在Kernel模式下,与taskExit()的作用相同。不过在用户模式下,exit()要强大一些,它会把当前的进程整个删除,并释放进程的内存空间。事实上,RTP的main()函数在执行完最后一条语句时,就会自动调用exit ()。同样,代码中很少显式的调用exit()。

taskDelete()的参数为0时就是删除任务本身,相当于taskExit(0)。换句话说,taskDelete()不同的地方是,它可以删除其它任务。

可以看到,不管任务是主动退出,还是被删除,都只是删除Stack和TCB(因为任务就是由它俩组成的),这就存在一个很大的风险,即任务在工作时占用的其它系统资源没有被释放。这些系统资源主要有三类:动态申请的内存,IO资源,互斥信号量。所以任务退出或删除时,务必对其资源进行回收(RTP里好一些,动态内存和私有信号量会随着RTP的退出而自动回收)。

另外,任务的退出或被删除,是不会通知其它任务的。而且任务被其它任务删除的话,它自己也是不知道具体的删除位置的。这就无法保证关系资源的回收,甚至可能破坏正在访问的数据。

不过通常情况下,只是在项目的开发调试阶段或软件的异常处理代码中,才会调用这些删除函数。

在正常的代码流程中,为了防止任务执行时被意外删除,可以使用taskSafe()和taskUnsafe()对任务进行保护。例如正在访问共享资源x的任务A突然被删除了,x的数据一致性就没法保证。而A调用taskSafe()后,其它任务试图删除A时,就会被阻塞,直到A调用taskUnsafe()解除保护。这种保护还支持嵌套使用,即调用taskUnsafe()之前,可以多次调用taskSafe(),不过后续需要调用相同次数的taskUnsafe()。

可以看到,文件fd、critical region和信号量都得到了保护。但动态内存buf有未释放的风险。

这正是:

任务自动退出,也可被动删除。

唯有共享资源,注意合理保护。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档