在《Task之任务的删除》里介绍了任务是如何退出的,那么进程呢?进程里可以启动多个任务,这些任务的存在与进程的存在是否有关系?
1
主任务返回,即main()函数执行return后,整个进程就会终止。看个例子
执行这个RTP
可以看到taskA并没有执行
把主任务的优先级降低
这次taskA能够执行了。这样就证明了主任务返回时,整个RTP也就退出了
2
如果主任务的工作确实已经做完了,而其它任务还有工作要做怎么办?可以让主任务自己退出,而不是直接返回:调用taskExit()
不管主任务的优先级如何,其它任务都会执行了
可以看到,即使主任务已经退出,taskA还会执行,说明RTP并没有随着主任务一起结束
3
为了让其它任务正常执行,除了主任务调用taskExit(),我在开发阶段常用的方法是taskSuspend()
这样通过主任务的状态,来控制RTP的状态,并且可以随时查看RTP的属性了
4
在2这种情况,即主任务调用taskExit()后,RTP是什么时候退出的呢:RTP不能为空,当最后一个任务退出后,RTP退出!
在RTP中启动多个任务
可以看到,RTP里的每个任务都会被执行,执行顺序取决于它们自己的优先级。只有它们都执行完之后,RTP才会结束
5
任一任务调用exit(),整个RTP就会退出
taskB的优先级高一些,所以它一旦被创建,就会抢占执行
一旦taskB调用exit(),整个RTP就都结束了,所以taskA和主任务就没有机会执行了
其实主任务在调用return正常返回时,就相当于调用了exit()
6
强制终止RTP,即调用rtpDelete()。把之前的例子改一下,这次让多个任务不退出
然后调用rtpDelete()删除RTP
rtpDelete()同时把RTP中的所有任务也删除了
也就是说,如果RTP中某个任务调用rtpDelete(0)的话,就相当于调用了exit(0),有兴趣的童鞋,可以试一试,也看看它俩的源码
总结一下,对于用户态的程序:
- 任一任务调用taskExit() - 当前任务结束
- 非主任务返回 - 相当于调用taskExit()
- rtpDelete() - 进程结束
- 任一任务调用exit() - 相当于调用rtpDelete()
- 主任务返回 - 相当于调用exit()
最后留个问题:内核态中,1-任务入口函数返回、2-其它函数返回、3-taskExit()、4-exit()、5-taskDelete(),这五者的关系如何?
这正是:
单任务可退出,无关它人调度。
主任务若返回,进程整体销毁。
我是泰山,专注VX15年!
欢迎关注VxWorks567
一起学习,共同进步!