- 論壇徽章:
- 0
|
5可用積分
小妹這兩周遇到一個可能要丟飯碗的問題,已經(jīng)折磨我2周了,再不能解決我就要~555了,危難時刻想懇請各位哥哥、姐姐、弟弟妹妹幫個忙,心急如焚,拜謝!
問題描述:要實現(xiàn)一個網(wǎng)絡(luò)服務(wù)端程序負責(zé)實時監(jiān)測各個與之連接/斷開的網(wǎng)絡(luò)客戶端的數(shù)據(jù)收發(fā)。
我的socket服務(wù)端程序中需要實時監(jiān)測客戶連接,每發(fā)現(xiàn)一個新的客戶連接我就創(chuàng)建一個MySockClient類的對象:MySockClient
類對象啟動時會pthread_create一個線程去負責(zé)與對應(yīng)客戶端通信(這個線程是個while(1)的死循環(huán),不會主動退出),當(dāng)客戶端斷
開時程序會delete MySockClient類對象,F(xiàn)在程序整體已經(jīng)實現(xiàn)完畢,但已經(jīng)測試發(fā)現(xiàn),當(dāng)客戶端反復(fù)連接/斷開時,
pthread_create每執(zhí)行一次時就會消耗掉大量的內(nèi)存,在delete MySockClient類對象時并沒有隨之釋放,導(dǎo)致最后資源耗盡而崩潰。
注:MySockClient類處理中沒有動態(tài)開辟的內(nèi)存資源,此處損耗經(jīng)確定為線程創(chuàng)建所產(chǎn)生
我把程序大致意思再用一個簡略的框架程序描述如下:
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);
....
};
....
};
//上面的線程處理函數(shù)TGC_ThreadFunc是一個包含while(1)的監(jiān)測處理程序,只有當(dāng)類delete時才能退出循環(huán)
在主進程中,服務(wù)端程序?qū)⒉粩啾O(jiān)測客戶連接情況,當(dāng)新來客戶連接時將new一個MySockClient的對象(其實也是創(chuàng)建一個線程為其處理事物),當(dāng)發(fā)現(xiàn)這個客戶斷開連接時
會調(diào)用delete MySockClient 以釋放類的資源, 其中主進程不會退出
現(xiàn)在的問題是:每次我new一個MySockClient的對象時,執(zhí)行pthread_create()將消耗大量的資源,但delete MySockClient時程序
調(diào)用了pthread_kill(FHandle, 0)卻沒有把線程的資源釋放掉。問題到底出在哪個地方,并且怎么解決呢?
小妹跪求各位指點,謝謝,謝謝! |
最佳答案
查看完整內(nèi)容
不想順著樓主的想法去想怎么做,我覺得你的起初的思路有問題,即使有人幫你解決了這個問題,估計你的飯碗會丟得很快了 ================================為什么不改一下你的設(shè)計,我以前做過跟你這個很相似的一個程序,憑經(jīng)驗提點意見:首先,最好不要動態(tài)創(chuàng)建線程來完成任務(wù),這樣實現(xiàn)起來麻煩,而且現(xiàn)在你已經(jīng)讓申請資源和回收資源搞得很煩了。其次,為什么不一開始就創(chuàng)建200或者500個線程,閑著,如果有連接到來,就將 ...
|