红联Linux门户
Linux帮助

加急跪求帮助:线程资源释放的问题

发布时间:2008-08-22 07:00:05来源:红联作者:zydzmapx
小妹这两周遇到一个可能要丢饭碗的问题,已经折磨我2周了,再不能解决我就要~555了,危难时刻想恳请各位哥哥、姐姐、弟弟妹妹帮个忙,心急如焚,拜谢!

问题描述:要实现一个网络服务端程序负责实时监测各个与之连接/断开的网络客户端的数据收发。
我的socket服务端程序中需要实时监测客户连接,每发现一个新的客户连接我就创建一个MySockClient类的对象:MySockClient

类对象启动时会pthread_create一个线程去负责与对应客户端通信(这个线程是个while(1)的死循环,不会主动退出),当客户端断

开时程序会delete MySockClient类对象。现在程序整体已经实现完毕,但已经测试发现,当客户端反复连接/断开时,

pthread_create每执行一次时就会消耗掉大量的内存,在delete MySockClient类对象时并没有随之释放,导致最后资源耗尽而崩溃。

注:MySockClient类处理中没有动态开辟的内存资源,此处损耗经确定为线程创建所产生
我把程序大致意思再用一个简略的框架程序描述如下:


class MySockClient
{
protected :
pthread_t FHandle;
bool TGC_CreateThread();

public :
MySockClient(bool bCreateThread)
{
....
int ret;
ret = pthread_create(&FHandle,NULL,TGC_ThreadFunc,(void *)this);
if ( ret !=0 )
printf ("Create pthread error!\n");
return;
}

....
}
~MySockClient()
{
....
pthread_kill(FHandle, 0);
....
};
....
};
//上面的线程处理函数TGC_ThreadFunc是一个包含while(1)的监测处理程序,只有当类delete时才能退出循环

在主进程中,服务端程序将不断监测客户连接情况,当新来客户连接时将new一个MySockClient的对象(其实也是创建一个线程为其处理事物),当发现这个客户断开连接时

会调用delete MySockClient 以释放类的资源, 其中主进程不会退出


现在的问题是:每次我new一个MySockClient的对象时,执行pthread_create()将消耗大量的资源,但delete MySockClient时程序

调用了pthread_kill(FHandle, 0)却没有把线程的资源释放掉。问题到底出在哪个地方,并且怎么解决呢?



小妹跪求各位指点,谢谢,谢谢!
文章评论

共有 2 条评论

  1. 于 2012-04-20 16:24:01发表:

    pthread_kill是给线程发信号~~不是释放线程资源~~
    你创建线程的时候指定下属性detech~~就可以让线程自动释放资源了~~
    详细怎么设置属性你上网找

  2. coolper 于 2008-08-22 08:53:49发表:

    使用thread pool能够解决thread create and destroy问题。