Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程回收
资源释放
线程退出前可以释放自己吗
发布于 2021-03-29 09:38:13 浏览:1391
订阅该版
[tocm] # 线程退出后可以释放自己吗? 根据开发经验,系统中很多错误都是由于资源延时释放导致的,例如在 IDLE 中释放一些系统中不再使用的资源。当然这其中也包括已经退出的线程本身原先所占用的资源。那么有一个问题就出现了,既然延时释放资源可能会带来这么多问题,那么线程退出后能否自己释放自己所占用的资源呢?这是个值得考虑的问题。 ## 线程为什么不能在退出前释放自己的资源 在 RT-Thread 系统中,线程本身的资源主要有两个,一个是线程控制块,一个是线程的栈,现在的问题是线程是否可以在退出前释放自己的资源? 答案是不可以的,因为无论是释放线程控制块还是线程栈,在释放资源后,一旦出现中断或者线程切换导致线程让出,再回来的时候,由于本线程的资源已经被释放,因此运行时环境就是错误的,无论是线程控制块还是栈都可能已经被改写,此时继续运行就会出现系统崩溃。 更详细一点说明,如果是先释放任务控制块,在释放完毕时,发生中断导致系统切换到其他线程中,在该线程中也申请内存,进而改写了原任务的任务控制块数据,此时如果想切换回原任务,但是任务控制块已经被破坏了,就会导致系统崩溃。先释放栈也是一个道理,都是不能允许的操作。 ## 那么是否能做到让线程自己释放自己的资源而不崩溃呢? 在释放自己资源的时候关闭系统中断,不让这块内存被其他任务申请走,这时候释放完资源,这些资源还没有被其他任务改写,此时使用直接切线程的方式切换到其他线程中,这时系统还能继续运行下去而不会出现崩溃。 ## 线程自然退出时会执行什么 首先线程本身也是一个函数,是函数就自然有函数返回地址,在进行线程初始化的时候,就将该线程的返回函数设置好了,也就是 `void rt_thread_exit(void)` 函数的地址,也就是将该函数的地址放到 LR 寄存器中,因此当函数返回时,就会去执行 `void rt_thread_exit(void)` 函数执行相应的后续处理函数。 - 栈初始化函数 ![image-20210329093136197.png](https://oss-club.rt-thread.org/uploads/20210329/c9662b1148ff87af8e4333dae3d5aaee.png) - 线程初始化时线程初始化函数被调用 ![image-20210329093209239.png](https://oss-club.rt-thread.org/uploads/20210329/cb121abe21b05aea3f286971721d2670.png) - 退出函数将该废弃线程从调度列表中删除,然后加入到废弃线程列表中 ![image-20210329093357911.png](https://oss-club.rt-thread.org/uploads/20210329/54aedc26c840109281d927af36f20b59.png) 在处理线程退出的过程中,会移除线程控制块,将自己从内核对象列表中移除,再将自己挂到废弃线程列表中,等待在 idle 线程中释放自己的资源。最后调用 schedule 函数切换到其他线程中运行。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
19
关注TA
发私信
相关文章
1
rt-thread 如何结束并释放一个 死循环线程
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部