线程自动结束后,有一部分空间哪去了
用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 线程控制块 这部分空间能回收不,要不我反复调用很多线程,空间上岂不有问题 看你都没保留sys_thread_new()返回的rt_thread_t句柄,那肯定没调用rt_thread_delete()啦~ 感觉线程运行结束后是自动删除的
在RT文档中48页有例子的注释
“ 线程2运行结束后也将自动被删除(线程控制块和线程栈依然在idle线程中释放)”
不解中 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);
....
} 感谢各位的回复,重新测试了下,rt_thread_create本身建立的空线程返回后确实不占用额外空间,问题出在
“ lwip_th = (struct lwip_thread*) rt_malloc (sizeof(struct lwip_thread));” 上
lwip_th的空间在何时回收呢, 再请问下ffxz大侠,我是否可以
方法1.将lwip_th作成全局指针数组,最大允许一定量的连接.在IDLE线程或其它定时执行线程中判断lwip_th的tid是否为NULL,若是就回收其空间?
方法2.将lwip_th作成全局指针数组,在sys_thread_new中找到一个空的lwip_th,然后赋值
哪种方法更妥当?或者还有其它方法? 不明白你为什么需要使用到sys_thread_new函数。
在RT-Thread/lwIP移植中,这个函数仅提供给lwIP内部使用,RT-Thread的application都使用原生的rt_thread_create。 开始是想用FINSH命令调用TCPCLIENT连接,但发现直接调用函数后,其它的FINSH命令就被阻塞了,于时参考
ppp.c中的sys_thread_new(PPP_THREAD_NAME, pppMain, (void*)pd, PPP_THREAD_STACKSIZE, PPP_THREAD_PRIO);
新建独立线程。同理,对于pppmain函数,我掉线重拔或出现其它错误时,关闭PPPMAIN后,也需要释放lwip_th,否则长时间运行多次连接后,内存会不足 若直接用rt_thread_create调用TCPCLIENT是否也可以?看来我还得好好理解下sys_thread_new的意义,看RT程序,跟踪到sys_arch_timeouts,后面的暂时没理解
页:
[1]