亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12345下一頁
最近訪問板塊 發(fā)新帖
查看: 21545 | 回復(fù): 44
打印 上一主題 下一主題

加急跪求幫助:線程資源釋放的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-08-21 19:28 |只看該作者 |倒序瀏覽
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個線程,閑著,如果有連接到來,就將 ...

論壇徽章:
0
2 [報告]
發(fā)表于 2008-08-21 19:28 |只看該作者
不想順著樓主的想法去想怎么做,我覺得你的起初的思路有問題,即使有人幫你解決了這個問題,估計你的飯碗會丟得很快了
================================
為什么不改一下你的設(shè)計,我以前做過跟你這個很相似的一個程序,憑經(jīng)驗提點意見:

首先,最好不要動態(tài)創(chuàng)建線程來完成任務(wù),這樣實現(xiàn)起來麻煩,而且現(xiàn)在你已經(jīng)讓申請資源和回收資源搞得很煩了。

其次,為什么不一開始就創(chuàng)建200或者500個線程,閑著,如果有連接到來,就將該任務(wù)分配給一個空閑線程,或者加入到正在工作的線程的任務(wù)隊列中,如果不幸500個線程都忙了,而且他們的
任務(wù)隊列都滿了,你可以告訴你的老板,這就是你的程序的性能極限

[ 本帖最后由 duanjigang 于 2008-8-21 21:20 編輯 ]

論壇徽章:
0
3 [報告]
發(fā)表于 2008-08-21 19:58 |只看該作者
設(shè)置一個標識位flag, 初始為0, 在析構(gòu)函數(shù)中去掉pthread_kill, 然后加上flag = 1;表示該對象已經(jīng)銷毀.
另外,在TGC_ThreadFunc中, 不是一個無限循環(huán)么? 在循環(huán)之初, 判斷flag的值, 如果為1, 則調(diào)用pthread_exit()退出線程.

論壇徽章:
0
4 [報告]
發(fā)表于 2008-08-21 20:00 |只看該作者
>>每次我new一個MySockClient的對象時,執(zhí)行pthread_create()將消耗大量的資源
線程創(chuàng)建不會消耗很大的資源啊.

論壇徽章:
95
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
5 [報告]
發(fā)表于 2008-08-21 20:15 |只看該作者
原帖由 zydzmapx 于 2008-8-21 19:28 發(fā)表
現(xiàn)在的問題是:每次我new一個MySockClient的對象時,執(zhí)行pthread_create()將消耗大量的資源,

有資源消耗情況的數(shù)據(jù)么?

論壇徽章:
0
6 [報告]
發(fā)表于 2008-08-21 20:16 |只看該作者
其實真的的原因是你沒有認真看pthread_kill的說明:
if sig is zero, error checking shall be performed but  no
       signal shall actually be sent.

所以此時你只是在檢查你的線程是否存在 ,但是并沒有終止這個線程.

或者你直接使用pthread_cancel()取代pthread_kill()

[ 本帖最后由 scutan 于 2008-8-21 20:25 編輯 ]

論壇徽章:
0
7 [報告]
發(fā)表于 2008-08-21 20:36 |只看該作者
發(fā)信號0首先沒有用,發(fā)起他信號的話也可能會對整個進程造成影響,
建立看看這組函數(shù)
pthread_cancel()
pthread_setcancelstate()
pthread_setcanceltype()

論壇徽章:
11
技術(shù)圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [報告]
發(fā)表于 2008-08-21 21:04 |只看該作者
原帖由 scutan 于 2008-8-21 20:16 發(fā)表
其實真的的原因是你沒有認真看pthread_kill的說明:

所以此時你只是在檢查你的線程是否存在 ,但是并沒有終止這個線程.

或者你直接使用pthread_cancel()取代pthread_kill()


     5樓已經(jīng)指出樓主用法的關(guān)鍵問題,使用pthread_kill(tid, 0)無法取消線程,即使第二個參數(shù)傳入正確的信號值,也會帶來額外的復(fù)雜性,比如進程級信號action和各線程信號mark設(shè)置不當(dāng)都會帶來問題。用pthtead_cacel(tid)更合適。
    還有補充的是,記得使用pthread_detach或pthread_join或設(shè)置線程屬性detachstate,否則線程終止后,資源也不能釋放。

論壇徽章:
0
9 [報告]
發(fā)表于 2008-08-21 22:18 |只看該作者

回復(fù) #2 scutan 的帖子

類似您說的flag標志在while循環(huán)中已經(jīng)存在,在delete類對象時程序已經(jīng)經(jīng)過~MySockClient()這部分,所以只要能執(zhí)行線程關(guān)閉的方法就可以了,但我的pthread_kill(FHandle, 0)感覺沒起任何用處

論壇徽章:
0
10 [報告]
發(fā)表于 2008-08-21 22:21 |只看該作者
回3樓:

根據(jù)我的反復(fù)測試,可以確定每執(zhí)行一次pthread_create()將消耗幾K或幾十K的資源,正是由于此,才存在要釋放線程資源的問題
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP