• <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>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            關于分離線程(轉)

            Posted on 2012-12-14 11:01 鑫龍 閱讀(212) 評論(0)  編輯 收藏 引用 所屬分類: linux編程

            線程的分離狀態(tài)決定一個線程以什么樣的方式來終止自己。
            線程的默認屬性,一般是非分離狀態(tài),
            這種情況下,原有的線程等待創(chuàng)建的線程結束。
            只有當pthread_join()函數(shù)返回時,創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。
            而分離線程沒有被其他的線程所等待,自己運行結束了,線程也就終止了,馬上釋放系統(tǒng)資源。
            程序員應該根據(jù)自己的需要,選擇適當?shù)姆蛛x狀態(tài)。

             

             

            關于分離線程的一種用法(轉)

             

            講到分離線程,先得從僵尸進程講起(抱歉,確實不知道線程是否有僵尸一說)。

            關于僵尸進程:一般情況下進程終止的時候,和它相關的系統(tǒng)資源也并不是主動釋放的,而是進入一種通常稱為“僵尸”(zombie)的狀態(tài)。它所占有 的資源一直被系統(tǒng)保留,直到它的父進程(如果它直接的父進程先于它去世,那么它將被init進程所收養(yǎng),這個時候init就是它的父進程)顯式地調用 wait系列函數(shù)為其“收尸”。為了讓父進程盡快知道它去世的消息,它會在它死去的時候通過向父進程發(fā)送SIGCHLD信號的方式向其“報喪”。

            所以一旦父進程長期運行,而又沒有顯示wait或者waitpid,同時也沒處理SIGCHLD信號,這個時候init進程,就沒辦法來替子進程來收尸。這個時候,子進程就真的成了”僵尸“了。

            同理:

            如果一個線程調用了這個函數(shù),那么當這個線程終止的時候,和它相關的系統(tǒng)資源將被自動釋放,系統(tǒng)不用也不能用pthread_join()等待其退 出。有的時候分離線程更好些,因為它潛在地減少了一個線程回收的同步點,并且pthread_join()這個API確實也是相當?shù)仉y用。

            為了讓主線程省去去子線程收尸的過程,可以使用

            int pthread_detach(pthread_t thread);

            來讓子線程處于分離狀態(tài),就不需要父線程再pthread_join了。

            我們來看一種分離線程的用法。上次別人問道一種情況,我發(fā)現(xiàn)必須要分離子線程:

            void* task1(void*);

            void usr();

            int p1;

            int main()
            {
            p1
            =0;
            usr();               
            //調用這個認為是你的觸發(fā)函數(shù)
                getchar();
            return 1;
            }

            void usr()
            {
            pthread_t  pid1;
            pthread_attr_t attr;
            /*這里做你的事情*/
            if(p1==0)
            {    pthread_attr_init(
            &attr);
            pthread_attr_setdetachstate(
            &attr, PTHREAD_CREATE_DETACHED);       //因為你的線程不便于等待的關系,設置為分離線程吧    
                        pthread_create(&pid1, &attr, task1, NULL);

            }

            }

            void* task1(void *arg1)
            {
            p1
            =1;                           //讓子線程不會被多次調用
                int i=0;
            printf(
            "thread1 begin./n");
            for(i=0;i<100;i++)
            {
            sleep(
            2);                  
            printf(
            "At thread1: i is %d/n",i);       
            usr();                    
            //繼續(xù)調用
               }
            pthread_exit();
            }
             

            我 們看到,在這里task1這個線程函數(shù)居然會多次調用其父線程里的函數(shù),顯然usr函數(shù)里,我們無法等待task1結束,反而task1會多次調用 usr,一旦我們在usr里pthread_join,則在子線程退出前,有多個usr函數(shù)會等待,很浪費資源。所以,此處,將task1設置為分離線程 是一種很好的做法。

            日韩精品久久久久久免费| 一本久久久久久久| 日韩久久久久久中文人妻| 国产午夜精品久久久久免费视| 日本精品久久久久中文字幕| 少妇久久久久久被弄到高潮| 久久人人爽人人爽人人爽| 2021久久精品国产99国产精品| 色噜噜狠狠先锋影音久久| 精品多毛少妇人妻AV免费久久| 国内精品久久久久影院优| 亚洲人AV永久一区二区三区久久| 无遮挡粉嫩小泬久久久久久久| 精品久久人人做人人爽综合| 欧美va久久久噜噜噜久久| 欧美午夜A∨大片久久 | 久久精品国产91久久综合麻豆自制 | 久久亚洲精品无码观看不卡| 亚洲精品蜜桃久久久久久| 久久99久久无码毛片一区二区 | 色综合色天天久久婷婷基地| 亚洲精品国产字幕久久不卡| 日韩亚洲国产综合久久久| 亚洲国产成人久久综合碰碰动漫3d | 久久综合九色欧美综合狠狠| 国产精品一久久香蕉国产线看| 热久久视久久精品18| 久久嫩草影院免费看夜色| 国产伊人久久| 久久国产成人午夜AV影院| 免费观看成人久久网免费观看| 国内精品人妻无码久久久影院 | 国产精品亚洲综合专区片高清久久久| 人妻无码中文久久久久专区| 久久婷婷五月综合97色 | 久久久艹| 久久亚洲视频| 久久九九兔免费精品6| 一本久久a久久精品vr综合| 一本色道久久88精品综合| 国产麻豆精品久久一二三|