回 帖 发 新 帖 刷新版面

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

小妹这两周遇到一个可能要丢饭碗的问题,已经折磨我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)却没有把线程的资源释放掉。问题到底出在哪个地方,并且怎么解决呢?



小妹跪求各位指点,谢谢,谢谢!

回复列表 (共1个回复)

沙发

用线程池,而不要 创建/销毁 线程.
使线程可以重用.

我来回复

您尚未登录,请登录后再回复。点此登录或注册