Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
线程彻底删除
发布于 2013-07-10 10:53:22 浏览:4710
订阅该版
在做基础的RTT实验,发现线程不能删干净,源码与实验结果如下: ``` /** 动态线程的创建实验 **/ #define THREAD_MAX 5 static void creat_entry(void* para) { while(1) { rt_kprintf("thread %d is running. ",para); rt_thread_delay(5*RT_TICK_PER_SECOND); } } static void test_thread_entry(void* parameter) { rt_thread_t tid[THREAD_MAX]; int i; for( i = 0; i < THREAD_MAX; i ++) { tid* = rt_thread_create("creat",creat_entry,(void *)i,512,20,5); if(tid* != RT_NULL) rt_thread_startup(tid*); else rt_kprintf("creat %d thread failed. ",i); } rt_thread_delay(16*RT_TICK_PER_SECOND); rt_thread_delete(tid[0]); rt_thread_delay(6*RT_TICK_PER_SECOND); rt_thread_delete(tid[1]); rt_thread_delay(6*RT_TICK_PER_SECOND); rt_thread_delete(tid[2]); rt_thread_delay(6*RT_TICK_PER_SECOND); rt_thread_delete(tid[3]); rt_thread_delay(6*RT_TICK_PER_SECOND); rt_thread_delete(tid[4]); while(1) { } } ``` 由test_thread线程创建5个creat线程,并在16s后每隔6s终止并回收一个线程,最终按理说list_thread()后不应该出现creat线程的,但是最终一直存在,不过状态是close。 ``` thread 0 is running. thread 3 is running. thread 2 is running. thread 1 is running. thread 4 is running. finsh>>list_thread() thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- creat 0x14 suspend 0x00000100 0x00000200 0x00000100 0x00000004 000 creat 0x14 suspend 0x00000100 0x00000200 0x00000100 0x00000005 000 creat 0x14 suspend 0x00000100 0x00000200 0x00000100 0x00000005 000 creat 0x14 suspend 0x00000100 0x00000200 0x00000100 0x00000005 000 creat 0x14 suspend 0x00000100 0x00000200 0x00000100 0x00000005 000 test 0x14 suspend 0x00000120 0x00000400 0x00000120 0x00000005 000 tcp_serv 0x14 suspend 0x00000170 0x00000400 0x00000198 0x00000005 000 tcpip 0x0c suspend 0x00000160 0x00000400 0x000001a8 0x00000013 000 etx 0x0f suspend 0x0000011c 0x00000200 0x0000011c 0x00000010 000 erx 0x0f suspend 0x0000011c 0x00000200 0x0000018c 0x00000010 000 tshell 0x14 ready 0x00000110 0x00000800 0x000001e0 0x00000003 -04 phy 0x1e suspend 0x00000118 0x00000200 0x00000150 0x00000002 000 tidle 0x1f ready 0x000000e0 0x00000400 0x000000e0 0x0000001d 000 timer 0x04 suspend 0x000000e0 0x00000200 0x000000e0 0x00000009 000 0, 0x00000000 thread 1 is running. thread 2 is running. thread 3 is running. thread 4 is running. thread 3 is running. thread 2 is running. thread 4 is running. thread 3 is running. thread 4 is running. thread 4 is running. ``` 等到最终状态,再list_thread() ``` thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- creat 0x14 close 0x00000100 0x00000200 0x00000100 0x00000004 000 test 0x14 ready 0x000000e8 0x00000400 0x00000120 0x00000005 000 tcp_serv 0x14 suspend 0x00000170 0x00000400 0x00000198 0x00000005 000 tcpip 0x0c suspend 0x00000160 0x00000400 0x000001a8 0x00000014 000 etx 0x0f suspend 0x0000011c 0x00000200 0x0000011c 0x00000010 000 erx 0x0f suspend 0x0000011c 0x00000200 0x0000018c 0x0000000f 000 tshell 0x14 ready 0x00000110 0x00000800 0x000001e0 0x00000005 -04 phy 0x1e ready 0x00000118 0x00000200 0x00000150 0x00000002 -02 tidle 0x1f ready 0x000000e0 0x00000400 0x000000e0 0x00000010 000 timer 0x04 suspend 0x000000e0 0x00000200 0x000000e0 0x00000009 000 0, 0x00000000 ``` 可以看到留下了一个close状态的"creat"线程。
查看更多
3
个回答
默认排序
按发布时间排序
aozima
2013-07-10
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>《编程指南》2.7.2 线程删除: > >对于一些使用rt_thread_create创建出来的线程,当不需要使用,或者运行出错时,我 >们可以使用下面的函数接口来从系统中把线程完全删除掉: >rt_err_t rt_thread_delete(rt_thread_t thread); >调用该函数后,线程对象将会被移出线程队列并且从内核对象管理器中删除,线 >程占用的堆栈空间也会被释放,收回的空间将重新用于其他的内存分配。实际上,用 >rt_thread_delete函数删除线程接口,仅仅是把相应的线程状态更改为RT_THREAD_STATE_CLOSE状态,然后放入到rt_thread_defunct队列中;而真正的删除动作(释放线程控制块和释放线 >程栈)需要到下一次执行idle线程时,由idle线程完成最后的线程删除动作。用rt_thread_init >初始化的静态线程则不能使用此接口删除。 --- 再看楼主的: ``` static void test_thread_entry(void* parameter) { while(1) { } } ```
celticzy
2013-07-10
这家伙很懒,什么也没写!
>>《编程指南》2.7.2 线程删除: >> >>对于一些使用rt_thread_create创建出来的线程,当不需要使用,或者运行出错时,我 >>们可以使用下面的函数接口来从系统中把线程完全删除掉: >>rt_err_t rt_thread_delete(rt_thread_t thread); >>调用该函数后,线程对象将会被移出线程队列并且从内核对象管理器中删除,线 >>程占用的堆栈空间也会被释放,收回的空间将重新用于其他的内存分配。实际上,用 >>rt_thread_delete函数删除线程接口,仅仅是把相应的线程状态更改为RT_THREAD_STATE_CLOSE状态,然后放入到rt_thread_defunct队列中;而真正的删除动作(释放线程控制块和释放线 >>程栈)需要到下一次执行idle线程时,由idle线程完成最后的线程删除动作。用rt_thread_init >>初始化的静态线程则不能使用此接口删除。 > >--- > > > > >再看楼主的: > >``` >static void test_thread_entry(void* parameter) >{ > while(1) > { > } >} >``` --- 明白了,非常谢谢!
撰写答案
登录
注册新账号
关注者
0
被浏览
4.7k
关于作者
celticzy
这家伙很懒,什么也没写!
提问
14
回答
54
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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组件
最新文章
1
rt-thread 小内存算法源码分析
2
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
8
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部