lhb358 发表于 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

syuanwang 发表于 2011-10-26 17:05:45

线程控制块

lhb358 发表于 2011-10-26 19:28:40

这部分空间能回收不,要不我反复调用很多线程,空间上岂不有问题

gzhuli 发表于 2011-10-26 19:52:37

看你都没保留sys_thread_new()返回的rt_thread_t句柄,那肯定没调用rt_thread_delete()啦~

lhb358 发表于 2011-10-27 09:06:30

感觉线程运行结束后是自动删除的
在RT文档中48页有例子的注释
“ 线程2运行结束后也将自动被删除(线程控制块和线程栈依然在idle线程中释放)”
不解中

ffxz 发表于 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);

....
}

lhb358 发表于 2011-10-27 13:58:42

感谢各位的回复,重新测试了下,rt_thread_create本身建立的空线程返回后确实不占用额外空间,问题出在
“ lwip_th = (struct lwip_thread*) rt_malloc (sizeof(struct lwip_thread));” 上
lwip_th的空间在何时回收呢,

lhb358 发表于 2011-10-28 08:59:40

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

ffxz 发表于 2011-10-28 09:52:46

不明白你为什么需要使用到sys_thread_new函数。

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

lhb358 发表于 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,否则长时间运行多次连接后,内存会不足

lhb358 发表于 2011-10-28 11:39:05

若直接用rt_thread_create调用TCPCLIENT是否也可以?看来我还得好好理解下sys_thread_new的意义,看RT程序,跟踪到sys_arch_timeouts,后面的暂时没理解
页: [1]
查看完整版本: 线程自动结束后,有一部分空间哪去了