chinachina 发表于 2011-12-13 16:00:39

rt-thread-RC1删除线程再创建线程出现内存爆仓现象,原因

rt-thread-RC1删除线程再创建线程出现内存爆仓现象
创建1个线程A,在A线程中创建B线程,
然后再重复删除B线程,创建B线程,出现内存不能释放,最终爆仓

代码如下:
while(1){
rt_thread_delay(100);
//删除线程B
if(thread_B != RT_NULL){
rt_thread_delete(thread_B);       
thread_B        = RT_NULL;       

rt_thread_delay(100);
thread_B = rt_thread_create("B",B, RT_NULL,2048, 18, 20);
if (thread_B != RT_NULL) rt_thread_startup(thread_B);
}
}
分析是删除线程后,内存来不及回收,再创建线程后内存增加,直到爆仓。

chinachina 发表于 2011-12-13 16:02:18

是系统有BUG还是线程删除的方法不对呢?

changjianfeng 发表于 2011-12-13 16:44:17

等待结果。

ffxz 发表于 2011-12-13 17:37:29

你的线程B代码是什么?while (1);?这样的话,显然会爆

chinachina 发表于 2011-12-13 18:01:18

回复【3楼】ffxz
---------------------------------------------------------------
是TCP服务器的代码。那要在线程A里循环创建和删除线程B该怎么办?

chinachina 发表于 2011-12-13 18:03:49

用deIete刪除线程后,还需要什么条件才能回收內存呢?

tiancaigao7 发表于 2011-12-13 21:07:23

RTT删除线程仅仅是将线程状态更改为close,之后释放资源需要到下次执行到空闲状态为止。因此建议要想删除线程可以考虑利用信号量。A线程释放信号量,B线程接收信号量,当接收到,就跳出到程序的末尾,这样线程会自动结束。

chinachina 发表于 2011-12-13 21:55:32

回复【6楼】tiancaigao7天才杨威利
-----------------------------------------------------------------------
如果是这样,一旦B线程卡住就关不掉了。Linux或winXP都是可以强制关闭的。

tiancaigao7 发表于 2011-12-14 20:17:51

RTT好像也有一个清理,仅仅是在例程里面见到过,但是手册上并没有讲。因此并不知道是不是实现这个功能的,例程上叫TC。你可以看看。

aureoleday 发表于 2011-12-18 00:15:39

想到爆仓,想起我当年的豆油
唉,往事不堪回首

chinachina 发表于 2011-12-19 11:21:14

回复【9楼】aureoleday
-----------------------------------------------------------------------

哈哈,原来你也玩期货啊。08年多铜爆仓的也不少。09年空铜爆仓的更多。
页: [1]
查看完整版本: rt-thread-RC1删除线程再创建线程出现内存爆仓现象,原因