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

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产欧美一区二区久久| 精品久久人人做人人爽综合 | 久久精品午夜一区二区福利 | 色综合合久久天天综合绕视看| 2020最新久久久视精品爱| 久久男人AV资源网站| 久久国产精品99精品国产| 久久人人爽人人精品视频| 丰满少妇人妻久久久久久| 亚洲午夜无码AV毛片久久| 国内精品久久久久久99| 久久笫一福利免费导航| 99久久精品免费看国产一区二区三区| 久久这里的只有是精品23| 久久精品成人免费看| 久久er99热精品一区二区| 伊色综合久久之综合久久| 99热精品久久只有精品| 精品亚洲综合久久中文字幕| 亚洲欧美久久久久9999| 久久精品国产精品青草app| 亚洲国产精品久久久久网站| 亚洲国产香蕉人人爽成AV片久久| 久久99精品久久久久子伦| 亚洲&#228;v永久无码精品天堂久久| 日韩AV无码久久一区二区| 理论片午午伦夜理片久久| 日本免费久久久久久久网站| 国产精品亚洲综合久久| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 麻豆精品久久久久久久99蜜桃| 精品久久久久久无码人妻蜜桃| 久久er国产精品免费观看2| 精品久久久久久久无码| MM131亚洲国产美女久久| 无码AV波多野结衣久久| 日产精品久久久久久久性色| 久久午夜羞羞影院免费观看| av国内精品久久久久影院| 999久久久免费精品国产| 久久亚洲精品中文字幕三区|