搜索
bottom↓
回复: 10

线程自动结束后,有一部分空间哪去了

[复制链接]

出0入0汤圆

发表于 2011-10-26 17:03:56 | 显示全部楼层 |阅读模式
用FINSH命令开启一个线程,线程为一个空函数。线程返回后,发现使用空间多了24B,这24B哪去了呢,望指点。
void tcpclient(const char* parameter)        //
{
        sys_thread_new ("TcpConn",TcpConn,(void*)parameter,2048, DEFAULT_THREAD_PRIO);          
}

finsh>>list_mem()                                        //查看内存
total memory: 37928
used memory : 4064
maximum allocated memory: 6260
        0, 0x00000000
finsh>>tcpclient()                                        //执行FINSH命令,开启线程
        536898532, 0x20006be4
finsh>>list_mem())                                        //查看内存
total memory: 37928
used memory : 4088
maximum allocated memory: 6284
        0, 0x00000000

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-10-26 17:05:45 | 显示全部楼层
线程控制块

出0入0汤圆

 楼主| 发表于 2011-10-26 19:28:40 | 显示全部楼层
这部分空间能回收不,要不我反复调用很多线程,空间上岂不有问题

出0入663汤圆

发表于 2011-10-26 19:52:37 | 显示全部楼层
看你都没保留sys_thread_new()返回的rt_thread_t句柄,那肯定没调用rt_thread_delete()啦~

出0入0汤圆

 楼主| 发表于 2011-10-27 09:06:30 | 显示全部楼层
感觉线程运行结束后是自动删除的
在RT文档中48页有例子的注释
“ 线程2运行结束后也将自动被删除(线程控制块和线程栈依然在idle线程中释放)”
不解中

出0入0汤圆

发表于 2011-10-27 10:22:34 | 显示全部楼层
sys_thread_new
这个是lwip的API

你也可看看这个函数的实现:
sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)
{
    rt_thread_t t;
    struct lwip_thread* lwip_th;

    /* create lwip thread */
    lwip_th = (struct lwip_thread*) rt_malloc (sizeof(struct lwip_thread));
    RT_ASSERT(lwip_th != RT_NULL);

....
}

出0入0汤圆

 楼主| 发表于 2011-10-27 13:58:42 | 显示全部楼层
感谢各位的回复,重新测试了下,rt_thread_create本身建立的空线程返回后确实不占用额外空间,问题出在
“ lwip_th = (struct lwip_thread*) rt_malloc (sizeof(struct lwip_thread));” 上
lwip_th的空间在何时回收呢,

出0入0汤圆

 楼主| 发表于 2011-10-28 08:59:40 | 显示全部楼层
再请问下ffxz大侠,我是否可以
方法1.将lwip_th作成全局指针数组,最大允许一定量的连接.在IDLE线程或其它定时执行线程中判断lwip_th的tid是否为NULL,若是就回收其空间?
方法2.将lwip_th作成全局指针数组,在sys_thread_new中找到一个空的lwip_th,然后赋值
哪种方法更妥当?或者还有其它方法?

出0入0汤圆

发表于 2011-10-28 09:52:46 | 显示全部楼层
不明白你为什么需要使用到sys_thread_new函数。

在RT-Thread/lwIP移植中,这个函数仅提供给lwIP内部使用,RT-Thread的application都使用原生的rt_thread_create。

出0入0汤圆

 楼主| 发表于 2011-10-28 11:21:38 | 显示全部楼层
开始是想用FINSH命令调用TCPCLIENT连接,但发现直接调用函数后,其它的FINSH命令就被阻塞了,于时参考
ppp.c中的sys_thread_new(PPP_THREAD_NAME, pppMain, (void*)pd, PPP_THREAD_STACKSIZE, PPP_THREAD_PRIO);
新建独立线程。同理,对于pppmain函数,我掉线重拔或出现其它错误时,关闭PPPMAIN后,也需要释放lwip_th,否则长时间运行多次连接后,内存会不足

出0入0汤圆

 楼主| 发表于 2011-10-28 11:39:05 | 显示全部楼层
若直接用rt_thread_create调用TCPCLIENT是否也可以?看来我还得好好理解下sys_thread_new的意义,看RT程序,跟踪到sys_arch_timeouts,后面的暂时没理解
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 14:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表