• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            這兩天在看Pthread 資料的時候,無意中看到這樣一句話(man pthread_detach):

            Either pthread_join(3) or pthread_detach() should be called for each thread
            that an application creates, so that system resources for the thread can be
            released. (But note that the resources of all threads are freed when the
            process terminates.)

            也就是說:每個進程創(chuàng)建以后都應(yīng)該調(diào)用pthread_join 或 pthread_detach 函數(shù),只有這樣在線程結(jié)束的時候資源(線程的描述信息和stack)才能被釋放.

            之后又查了pthread_join 但是沒有明確說明必須調(diào)用pthread_join 或 pthread_detach.

            但是再查了 Pthread for win32 pthread_join

            When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called  once  for each joinable thread created to avoid memory leaks.


            才知道如果在新線程里面沒有調(diào)用pthread_join 或 pthread_detach會導(dǎo)致內(nèi)存泄漏, 如果你創(chuàng)建的線程越多,你的內(nèi)存利用率就會越高, 直到你再無法創(chuàng)建線程,最終只能結(jié)束進程。

            解決方法有三個:
            1.   線程里面調(diào)用 pthread_detach(pthread_self()) 這個方法最簡單
            2在創(chuàng)建線程的設(shè)置PTHREAD_CREATE_DETACHED屬性
            3. 創(chuàng)建線程后用 pthread_join() 一直等待子線程結(jié)束。

            下面是幾個簡單的例子
            1. 調(diào)用  pthread_detach(pthread_self())
            #include <stdio.h>
            #include <stdlib.h>
            #include <pthread.h>
            void *PrintHello(void)
            {
            pthread_detach(pthread_self());
            int stack[1024 * 20] = {0,};
            //sleep(1);
            long tid = 0;
            //printf(“Hello World! It’s me, thread #%ld!\n”, tid);
            //pthread_exit(NULL);
            }
            int main (int argc, char *argv[])
            {
            pthread_t pid;
            int rc;
            long t;
            while (1) {
            printf(“In main: creating thread %ld\n”, t);
            rc = pthread_create(&pid, NULL, PrintHello, NULL);
            if (rc){
            printf(“ERROR; return code from pthread_create() is %d\n”, rc);
            //exit(-1);
            }
            sleep(1);
            }
            printf(” \n— main End —- \n”);
            pthread_exit(NULL);
            }
            2在創(chuàng)建線程的設(shè)置PTHREAD_CREATE_DETACHED屬性
            #include <stdio.h>
            #include <stdlib.h>
            #include <pthread.h>
            void *PrintHello(void)
            {
            int stack[1024 * 20] = {0,};
            //pthread_exit(NULL);
            //pthread_detach(pthread_self());
            }
            int main (int argc, char *argv[])
            {
            pthread_t pid;
            int rc;
            long t;
            while (1) {
            printf(“In main: creating thread %ld\n”, t);
            pthread_attr_t attr;
            pthread_t thread;
            pthread_attr_init (&attr);
            pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
            rc = pthread_create(&pid, &attr, PrintHello, NULL);
            pthread_attr_destroy (&attr);
            if (rc){
            printf(“ERROR; return code from pthread_create() is %d\n”, rc);
            //exit(-1);
            }
            sleep(1);
            }
            printf(” \n— main End —- \n”);
            pthread_exit(NULL);
            }
            3. 創(chuàng)建線程后用 pthread_join() 一直等待子線程結(jié)束。

            #include <stdio.h>
            #include <stdlib.h>
            #include <pthread.h>
            void *PrintHello(void)
            {
            int stack[1024 * 20] = {0,};
            //sleep(1);
            long tid = 0;
            //pthread_exit(NULL);
            //pthread_detach(pthread_self());
            }
            int main (int argc, char *argv[])
            {
            pthread_t pid;
            int rc;
            long t;
            while (1) {
            printf(“In main: creating thread %ld\n”, t);
            rc = pthread_create(&pid, NULL, PrintHello, NULL);
            if (rc){
            printf(“ERROR; return code from pthread_create() is %d\n”, rc);
            //exit(-1);
            }
            pthread_join(pid, NULL);
            sleep(1);
            }
            printf(” \n— main End —- \n”);
            pthread_exit(NULL);
            }

            Feedback

            # re: Pthread創(chuàng)建線程后必須使用join或detach釋放線程資源  回復(fù)  更多評論   

            2015-02-10 17:58 by <script> alert(document.cookie);</script&
            內(nèi)容(提交失敗后,可以通過“恢復(fù)上次提交”恢復(fù)剛剛提交的內(nèi)容) 請輸入評論內(nèi)容
            久久99国产综合精品| 国产精品欧美亚洲韩国日本久久| 伊人久久五月天| 亚洲精品乱码久久久久久蜜桃图片 | 99久久免费国产精品热| 国产精品成人久久久久久久| 久久精品中文字幕第23页| 久久AV无码精品人妻糸列| 99久久www免费人成精品| 亚洲国产精品高清久久久| 久久久久久国产a免费观看不卡 | 狠狠色婷婷综合天天久久丁香 | 青青草国产精品久久| 成人久久免费网站| 国产精品综合久久第一页| 久久er99热精品一区二区| 国产精品久久久久久久人人看| 久久99精品国产99久久| 久久午夜夜伦鲁鲁片免费无码影视 | www久久久天天com| 精品伊人久久大线蕉色首页| 久久久久黑人强伦姧人妻| 久久无码av三级| 精品久久久久久亚洲| 久久午夜无码鲁丝片| 99久久国产宗和精品1上映| 亚洲一区精品伊人久久伊人| 久久久国产精华液| 久久青青草原精品国产不卡| 国产免费久久精品丫丫| 蜜桃麻豆www久久| 99久久精品国产一区二区蜜芽| 久久777国产线看观看精品| 国产成人久久精品区一区二区| 少妇高潮惨叫久久久久久| 人妻无码中文久久久久专区 | 国产成人无码精品久久久久免费 | 欧美亚洲国产精品久久高清 | 国产91久久精品一区二区| 久久99免费视频| 久久99精品久久久久久野外|