• <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>

            小默

            thread 線程屬性 脫離線程

            線程的屬性

            脫離線程:不向主線程返回信息,不需要主線程等待.
            通過兩種方法創(chuàng)建:
            調(diào)用pthread_detach;
            修改線程的屬性. <- 這里使用

            #include <pthread.h>
            int pthread_attr_init(pthread_attr_t *attr);
            初始化一個線程屬性對象.
            pthread_destroy
            回收一個線程屬性對象.

            #include <pthread.h>
            int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
            int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
            這個屬性允許我們無需對線程進行合并:
            | PTHREAD_CREATE_JOINABLE 默認.
            | PTHREAD_CREATE_DETACHED 不能調(diào)用pthread_join來獲得另一個線程的退出狀態(tài).

            int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
            int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
            控制線程的調(diào)度方式:
            | SCHED_OTHER 默認
            | SCHED_RP   循環(huán)(round_robin) <- 下面2個調(diào)度方式具備實時調(diào)度功能,需要root權(quán)限.
            | SCHED_FIFO 先進先出

            int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
            int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
            和schedpolicy配合使用,控制SCHED_OTHER線程的調(diào)度策略.

            int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
            int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
            | PTHREAD_EXPLICIT_SCHED 調(diào)度由屬性明確設(shè)置.
            | PTHREAD_INHERIT_SCHED  新線程沿用創(chuàng)建者的屬性.

            int pthread_attr_setscope(pthread_attr_t *attr, int scope);
            int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
            控制一個線程調(diào)度的計算方式,目前Linux只支持PTHREAD_SCOPE_SYSTEM.

            int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);
            int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope);
            控制線程創(chuàng)建的棧大小,單位字節(jié).可選.
            Linux在實現(xiàn)線程時,默認的棧很大,這個屬性有點多余.

            創(chuàng)建脫離線程:
            /*
             * 線程屬性-創(chuàng)建脫離線程
             * 主線程不等待子線程結(jié)束,只通過thread_finished標志來檢測子線程是否已結(jié)束,并顯示線程之間仍然共享的變量.
             
            */
            #include 
            <stdio.h>
            #include 
            <unistd.h>
            #include 
            <stdlib.h>
            #include 
            <pthread.h>

            void *thread_function(void *arg);

            char g_message[] = "Hello World!";
            int g_thread_finished = 0;

            int main(){
                
            int res;
                pthread_t a_thread;
                pthread_attr_t thread_attr;

                res 
            = pthread_attr_init(&thread_attr);
                
            if(res != 0){
                    perror(
            "Attribute creation failed");
                    exit(EXIT_FAILURE);
                }

                res 
            = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
                
            if(res != 0){
                    perror(
            "Setting detached attribute failed");
                    exit(EXIT_FAILURE);
                }

                res 
            = pthread_create(&a_thread, &thread_attr,
                        thread_function, (
            void *)g_message);
                
            if(res != 0){
                    perror(
            "Thread creation failed");
                    exit(EXIT_FAILURE);
                }

                (
            void)pthread_attr_destroy(&thread_attr);
                
            while(!g_thread_finished){
                    printf(
            "Waiting for thread to say it's finished\n");
                    sleep(
            1);
                }
                printf(
            "Other thread finished, bye!\n");
                exit(EXIT_SUCCESS);
            }

            void *thread_function(void *arg){
                printf(
            "thread_function is running. Argument was %s\n", (char *)arg);
                sleep(
            4);
                printf(
            "Second thread setting finished flag, and exit now\n");
                g_thread_finished 
            = 1;
                pthread_exit(NULL);
            }

            執(zhí)行結(jié)果:
            $ gcc -D_REENTRANT thread5.c -o thread5 -lpthread  
            $ .
            /thread5 
            Waiting 
            for thread to say it's finished
            thread_function is running. Argument was Hello World!
            Waiting 
            for thread to say it's finished
            Waiting for thread to say it's finished
            Waiting for thread to say it's finished
            Second thread setting finished flag, and exit now
            Other thread finished, bye
            !

            --
            FROM: Linux程序設(shè)計

            posted on 2011-06-14 18:56 小默 閱讀(2241) 評論(0)  編輯 收藏 引用 所屬分類: Linux

            導(dǎo)航

            統(tǒng)計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久93精品国产91久久综合| 亚洲国产视频久久| 亚洲国产精品久久| 精品熟女少妇aⅴ免费久久| 久久这里有精品| 99久久免费国产精精品| 日韩久久无码免费毛片软件| 无码国产69精品久久久久网站| 国产精品免费看久久久香蕉| 亚洲国产精品无码久久一线| 久久综合五月丁香久久激情| 久久99精品久久久久久hb无码| 久久综合狠狠综合久久97色| 国产精品99久久免费观看| 久久久午夜精品福利内容| 人人狠狠综合久久亚洲婷婷| 久久久久亚洲AV无码专区体验| 久久久久九九精品影院| 青青草原综合久久| 久久久久亚洲精品无码蜜桃| 亚洲乱码精品久久久久..| 久久无码专区国产精品发布| 久久久久噜噜噜亚洲熟女综合| 成人资源影音先锋久久资源网| 无码日韩人妻精品久久蜜桃| 久久亚洲精品国产亚洲老地址| 久久综合五月丁香久久激情| 国产亚洲精午夜久久久久久| 91精品观看91久久久久久 | 久久久国产乱子伦精品作者| 伊人久久国产免费观看视频| 武侠古典久久婷婷狼人伊人| 亚洲欧美成人久久综合中文网| 爱做久久久久久| 久久AAAA片一区二区| 欧美777精品久久久久网| 久久se精品一区精品二区| 久久精品国产秦先生| 国内精品久久久久久麻豆| 国产农村妇女毛片精品久久| 四虎影视久久久免费|