Linux線程pthread_attr_t 線程屬性(轉(zhuǎn))

ATTENTION:附加代碼鏈接:
http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html

  1. 線程屬性:
    使用pthread_attr_t類型表示绿淋,我們需要對(duì)此結(jié)構(gòu)體進(jìn)行初始化晃危,
    初始化后使用,使用后還要進(jìn)行去除初始化穆律!
    pthread_attr_init:初始化
    pthread_attr_destory:去除初始化

          #include <pthread.h>
          int pthread_attr_init(pthread_attr_t *attr);
          int pthread_attr_destroy(pthread_attr_t *attr);   
          若成功返回0,若失敗返回-1崇众。
         
          pthread_attr_init之后滤蝠,pthread_t結(jié)構(gòu)所包含的內(nèi)容就是操作系統(tǒng)實(shí)現(xiàn)
          支持的線程所有屬性的默認(rèn)值。
         
          如果pthread_attr_init實(shí)現(xiàn)時(shí)為屬性對(duì)象分配了動(dòng)態(tài)內(nèi)存空間嘱巾,
          pthread_attr_destroy還會(huì)用無(wú)效的值初始化屬性對(duì)象憨琳,因此如果經(jīng)
          pthread_attr_destroy去除初始化之后的pthread_attr_t結(jié)構(gòu)被
          pthread_create函數(shù)調(diào)用,將會(huì)導(dǎo)致其返回錯(cuò)誤旬昭。
         
          線程屬性結(jié)構(gòu)如下:
    
          typedef struct
          {
                 int                           detachstate;     線程的分離狀態(tài)
                 int                          schedpolicy;   線程調(diào)度策略
                 struct sched_param      schedparam;   線程的調(diào)度參數(shù)
                 int                          inheritsched;    線程的繼承性
                 int                          scope;          線程的作用域
                 size_t                      guardsize; 線程棧末尾的警戒緩沖區(qū)大小
                 int                          stackaddr_set;
                 void *                     stackaddr;      線程棧的位置
                 size_t                      stacksize;       線程棧的大小
          }pthread_attr_t;
         
          下面主要討論此結(jié)構(gòu)體8菝!问拘!
    
  2. 分離狀態(tài):
    線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來(lái)終止自己遍略。

      我們已經(jīng)在前面已經(jīng)知道,在默認(rèn)情況下線程是非分離狀態(tài)的骤坐,這種情況   
      下绪杏,原有的線程等待創(chuàng)建的線程結(jié)束。只有當(dāng)pthread_join() 函數(shù)返回       
      時(shí)纽绍,創(chuàng)建的線程才算終止蕾久,才能釋放自己占用的系統(tǒng)資源。   
     
      分離線程沒(méi)有被其他的線程所等待拌夏,自己運(yùn)行結(jié)束了僧著,線程也就終止了,
      馬上釋放系統(tǒng)資源障簿。
     
      通俗的說(shuō)也就是:我們知道一般我們要等待(pthread_join)一個(gè)線程的結(jié)束霹抛,
      主要是想知道它的結(jié)束狀態(tài),否則等待一般是沒(méi)有什么意義的卷谈!但是if有一
      些線程的終止態(tài)我們壓根就不想知道杯拐,那么就可以使用“分離”屬性,那么我
      們就無(wú)須等待管理世蔗,只要線程自己結(jié)束了端逼,自己釋放src就可以咯!這樣更
      方便污淋!
     
      #include <pthread.h>
      int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * detachstate);
      int pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate);
      參數(shù):attr:線程屬性變量
              detachstate:分離狀態(tài)屬性   
      若成功返回0顶滩,若失敗返回-1。
     
      設(shè)置的時(shí)候可以有兩種選擇:
      <1>.detachstate參數(shù)為:PTHREAD_CREATE_DETACHED     分離狀態(tài)啟動(dòng)
      <2>.detachstate參數(shù)為:PTHREAD_CREATE_JOINABLE    正常啟動(dòng)線程
    
  3. 線程的繼承性:

      函數(shù)pthread_attr_setinheritsched和pthread_attr_getinheritsched分別用來(lái)設(shè)
      置和得到線程的繼承性!
     
      #include <pthread.h>
      int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);
      int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);
      參數(shù):
      attr                線程屬性變量
      inheritsched     線程的繼承性
      若成功返回0寸爆,若失敗返回-1礁鲁。
     
      請(qǐng)注意:
      繼承性決定調(diào)度的參數(shù)是從創(chuàng)建的進(jìn)程中繼承還是使用在 
      schedpolicy和schedparam屬性中顯式設(shè)置的調(diào)度信息盐欺。           
                             
      線程沒(méi)有默認(rèn)的繼承值設(shè)置,所以如果關(guān)心線程的調(diào)度策略和參數(shù)仅醇,
      只能手動(dòng)設(shè)置冗美!
     
      可設(shè)置參數(shù):
      PTHREAD_INHERIT_SCHED: 新的線程繼承創(chuàng)建線程的策略和參數(shù)!
      PTHREAD_EXPLICIT_SCHED:新的線程繼承策略和參數(shù)來(lái)自于
                                          schedpolicy和schedparam屬性中顯式
                                          設(shè)置的調(diào)度信息析二!
    

: 下面補(bǔ)充線程調(diào)度策略和調(diào)度參數(shù):
<1>.調(diào)度策略:

                函數(shù)pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分別用
                來(lái)設(shè)置和得到線程的調(diào)度策略粉洼。
               
                int pthread_attr_getschedpolicy(const pthread_attr_t *, int * policy)
                int pthread_attr_setschedpolicy(pthread_attr_*, int policy)
                參數(shù):
                        attr            線程屬性變量
                        policy        調(diào)度策略   
                若成功返回0,若失敗返回-1叶摄。
               
                所謂調(diào)度策略也就是我們之前在OS中所學(xué)過(guò)的那些調(diào)度算法:
                SCHED_FIFO    :先進(jìn)先出
                SCHED_RR       :輪轉(zhuǎn)法
                SCHED_OTHER    :其他方法
               
                SCHED_OTHER是不支持優(yōu)先級(jí)使用的,而SCHED_FIFO和SCHED_RR
                支持優(yōu)先級(jí)的使用,他們分別為1和99,數(shù)值越大優(yōu)先級(jí)越高.
               
                注意:
                        > 此處的SCHED_FIFO是允許被高優(yōu)先級(jí)搶占的属韧!
                        > 也就是有高優(yōu)先級(jí)的必須先運(yùn)行
                        > SCHED_RR是設(shè)置一個(gè)時(shí)間片
                        > 當(dāng)有SCHED_FIFO或SCHED_RR策賂的線程在一個(gè)條件變量
                        上等持或等持加鎖同一個(gè)互斥量時(shí),它們將以優(yōu)先級(jí)順序被喚
                        醒蛤吓。即宵喂,如果一個(gè)低優(yōu)先級(jí)的SCHED_FIFO線程和一個(gè)高優(yōu)先
                        織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當(dāng)互斥量
                        被解鎖時(shí)会傲,高優(yōu)先級(jí)線程將總是被首先解除阻塞锅棕。
                       
        <2>.調(diào)度參數(shù):
               
                函數(shù)pthread_attr_getschedparam 和pthread_attr_setschedparam分別
                用來(lái)設(shè)置和得到線程的調(diào)度參數(shù)。
               
                   

                int pthread_attr_getschedparam(const pthread_attr_t *,struct
                sched_param *);
                int pthread_attr_setschedparam(pthread_attr_t *,const struct
                sched_param *);
                參數(shù):
                        attr            線程變量屬性
                        param        sched_parm 結(jié)構(gòu)體
                若成功返回0唆铐,若失敗返回-1哲戚。
               
                /usr/include /bits/sched.h
                struct sched_param
                {
                       int sched_priority;    //!> 參數(shù)的本質(zhì)就是優(yōu)先級(jí)
                };
                注意:大的權(quán)值對(duì)應(yīng)高的優(yōu)先級(jí)!
                系統(tǒng)支持的最大和最小的優(yōu)先級(jí)值可以用函數(shù):
                sched_get_priority_max和sched_get_priority_min得到!
               
                #include <pthread.h>
                int sched_get_priority_max( int policy );
                int sched_get_priority_min( int policy );
                參數(shù):max_:    系統(tǒng)支持的優(yōu)先級(jí)的最小值
                        min_ :    系統(tǒng)支持的優(yōu)先級(jí)的最大值
               
                使用:max_ = sched_get_priority_max( policy );
                        min_ = sched_get_priority_min( policy );
                        注意參數(shù)是policy調(diào)用策略艾岂,也就是說(shuō)對(duì)于不同的策略的值是不
                        一樣的顺少!
           
                附錄:來(lái)自
                http://www.yuanma.org/data/2006/0823/article_1392.htm
                policy = SCHED_OTHER
                max_priority = 0
                min_priority = 0

                Show SCHED_FIFO of priority
                max_priority = 99
                min_priority = 1
               
                Show SCHED_RR of priority
                max_priority = 99
                min_priority = 1

                Show priority of current thread
                priority = 0
  1. 線程的作用域:

      函數(shù)pthread_attr_setscope和pthread_attr_getscope分別
      用來(lái)設(shè)置和得到線程的作用域。       
      #include <pthread.h>   
      int    pthread_attr_getscope( const pthread_attr_t * attr, int * scope );
      int pthread_attr_setscope( pthread_attr_t*, int scope );
      參數(shù):
              attr               線程屬性變量
              scope         線程的作用域       
      若成功返回0王浴,若失敗返回-1脆炎。
     
      作用域控制線程是否在進(jìn)程內(nèi)或在系統(tǒng)級(jí)上競(jìng)爭(zhēng)資源,可能的值是
      PTHREAD_SCOPE_PROCESS(進(jìn)程內(nèi)競(jìng)爭(zhēng)資源)
      PTHREAD_SCOPE_SYSTEM   (系統(tǒng)級(jí)競(jìng)爭(zhēng)資源)氓辣。
    
  2. 線程堆棧的大小

      函數(shù)pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來(lái)設(shè)置和得
      到線程堆棧的位置秒裕。
     
      int pthread_attr_getstacksize(const pthread_attr_t *,size_t * stacksize);
      int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);
      參數(shù):attr                線程屬性變量
              stacksize        堆棧大小
      若成功返回0,若失敗返回-1钞啸。           
    
  3. 線程堆棧的地址

      #include <pthread.h>
      int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);
      int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);
      參數(shù):attr               線程屬性變量
              stackaddr     堆棧地址           
      若成功返回0几蜻,若失敗返回-1。
     
      注意:pthread_attr_getstackaddr已經(jīng)過(guò)期体斩,現(xiàn)在使用的是:pthread_attr_getstack
    
  4. 警戒緩沖區(qū)

      函數(shù)pthread_attr_getguardsize和pthread_attr_setguardsize分別用來(lái)設(shè)置和得
      到線程棧末尾的警戒緩沖區(qū)大小梭稚。
    
      #include <pthread.h>                   
      int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict
      guardsize);
      int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);
      若成功返回0,若失敗返回-1絮吵。
     
      值得注意:
                  線程屬性guardsize控制著線程棧末尾之后以避免棧溢出的擴(kuò)展內(nèi)存
                  大小弧烤。這個(gè)屬性默認(rèn)設(shè)置為PAGESIZE個(gè)字節(jié)〉徘茫可以把guardsize線
                  程屬性設(shè)為0暇昂,從而不允許屬性的這種特征行為發(fā)生:在這種情況
                  下不會(huì)提供警戒緩存區(qū)莺戒。同樣地,如果對(duì)線程屬性stackaddr作了
                  修改急波,系統(tǒng)就會(huì)認(rèn)為我們會(huì)自己管理?xiàng)4硬⑹咕錀>彌_區(qū)機(jī)制無(wú)
                  效,等同于把guardsize線程屬性設(shè)為0幔崖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末食店,一起剝皮案震驚了整個(gè)濱河市渣淤,隨后出現(xiàn)的幾起案子赏寇,更是在濱河造成了極大的恐慌,老刑警劉巖价认,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅定,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡用踩,警方通過(guò)查閱死者的電腦和手機(jī)渠退,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脐彩,“玉大人碎乃,你說(shuō)我怎么就攤上這事』菁椋” “怎么了梅誓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)佛南。 經(jīng)常有香客問(wèn)我梗掰,道長(zhǎng),這世上最難降的妖魔是什么嗅回? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任及穗,我火速辦了婚禮,結(jié)果婚禮上绵载,老公的妹妹穿的比我還像新娘埂陆。我一直安慰自己,他們只是感情好娃豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布焚虱。 她就那樣靜靜地躺著,像睡著了一般培愁。 火紅的嫁衣襯著肌膚如雪著摔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天定续,我揣著相機(jī)與錄音谍咆,去河邊找鬼禾锤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摹察,可吹牛的內(nèi)容都是我干的恩掷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼供嚎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黄娘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起克滴,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逼争,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后劝赔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體誓焦,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年着帽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杂伟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仍翰,死狀恐怖赫粥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情予借,我是刑警寧澤越平,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蕾羊,受9級(jí)特大地震影響喧笔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龟再,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一书闸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧利凑,春花似錦浆劲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至割按,卻和暖如春膨报,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工现柠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留院领,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓够吩,卻偏偏與公主長(zhǎng)得像比然,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子周循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:Youtherhttps://www.cnblogs.com/youtherhome/archive/201...
    njukay閱讀 1,607評(píng)論 0 52
  • 線程可以經(jīng)過(guò)更多高級(jí)內(nèi)容的設(shè)置强法,可以控制的屬性很多; 前面的例子中湾笛,我們?cè)诔绦蛲顺鲋坝昧藀thread_join...
    helinyu閱讀 455評(píng)論 0 1
  • Linux-創(chuàng)建進(jìn)程與線程用到的函數(shù)解析 【1】exit: exit函數(shù)可以退出程序并將控制權(quán)返回給操作系統(tǒng)饮怯,而用...
    Yojiaku閱讀 3,592評(píng)論 0 2
  • 一夢(mèng)醒來(lái)天未曙, 披星戴露伴月出迄本。 錦衣繁花世代夢(mèng)硕淑, 人生苦在不知足课竣。
    釋迦干屎橛閱讀 166評(píng)論 0 1
  • 問(wèn)這個(gè)問(wèn)題之前于樟,我想說(shuō)公条,我相信,或者是我的潛意識(shí)相信迂曲。 記得高中快畢業(yè)時(shí)靶橱,寫(xiě)了一張如題的紙條,傳給5個(gè)男同學(xué)路捧,得到...
    金剛智慧曉敏讀書(shū)閱讀 336評(píng)論 5 5