pthread線程屬性介紹


 線程屬性

創建線程函數

int pthread_create (pthread_t* restrictthread,  const pthread_attr_t* restrictattr,void* (*start_routine) (void*), void* restrict arg);

的第二個參數即為線程屬性,傳空指針表示使用缺省屬性。

線程屬性為一個結構體。詳細例如以下

typedef struct

{      

int        detachstate;       //線程的分離狀態

int        schedpolicy;    //線程調度策略

structsched_param  schedparam;  //線程的調度參數

int         inheritsched;     //線程的繼承性

int         scope;         //線程的作用域

size_t       guardsize;     //線程棧末尾的警戒緩沖區大小

void*       stackaddr;      //線程棧的位置

size_t       stacksize;        //線程棧的大小

}pthread_attr_t;

 

 

一、線程分離狀態:detachstate

該屬性決定了線程運行任務后以什么方式來結束自己。

方式如

(1) PTHREAD_CREATE_DETACHED    ——    分離線程

置為分離線程的線程。當不須要被不論什么線程等待,線程運行完任務后,自己自己主動結束線程,並釋放資源。

(2) PTHREAD_CREATE_JOINABLE(缺省)  ——    可匯合線程

可匯合線程為線程的默認狀態,這樣的情況下,原有的線程等待創建的線程結束。僅僅有當pthread_join()函數返回時。創建的線程才算終止。才干釋放自己占用的系統資源。


二、線程的調度策略:schedpolicy

(1) SCHED_FIFO(先進先出策略)

FIFO線程持續執行,直至有更高優先級的線程就緒,或者線程本身進入堵塞狀態。

當FIFO線程堵塞時,系統將其移出就緒隊列,恢復后再增加到同優先級就緒隊列的末尾。當FIFO線程被高優先級線程搶占時。它在就緒隊列中的位置不變。因此一旦高優先級線程終止或堵塞,被搶占的FIFO線程會馬上繼續執行

 

(2) SCHED_RR(輪轉策略)

每一個RR線程會獲得一個時間片,一旦RR線程的時間片耗盡,系統即將移到就緒隊列的末尾。

 

(3) SCHED_OTHER(缺省)

靜態優先級為0。不論什么就緒的FIFO線程或RR線程,都會搶占此類線程。


三、調度參數 : sched_param  schedparam

這兩個函數具有兩個參數。第1個參數是指向屬性對象的指針。第2個參數是sched_param結構或指向該結構的指針。結構sched_param在文件/usr/include /bits/sched.h中定義例如以下:

struct sched_param

{

       intsched_priority;

};

結構sched_param的子成員sched_priority控制一個優先權值,大的優先權值相應高的優先權。

系統支持的最大和最小優先權值能夠用sched_get_priority_max函數和sched_get_priority_min函數分別得到。

注意:假設不是編寫實時程序,不建議改動線程的優先級。由於,調度策略是一件很復雜的事情,假設不對使用會導致程序錯誤,從而導致死鎖等問題。

如:在多線程應用程序中為線程設置不同的優先級別,有可能由於共享資源而導致優先級倒置

 

四、線程的繼承性: inheritsched

(1) PTHREAD_INHERIT_SCHED(缺省) —— 調度屬性自創建者線程繼承

(2) PTHREAD_EXPLICIT_SCHED —— 調度屬性由調度參數和調度策略決定

    繼承性決定調度的參數是從創建的進程中繼承還是使用在schedpolicy和schedparam屬性中顯式設置的調度信息。Pthreads不為inheritsched指定默認值,因此假設你關心線程的調度策略和參數,必須先設置該屬性

 

五、線程的作用域:scope

線程的競爭范圍。

PTHREAD_SCOPE_SYSTEM ——在系統范圍內競爭資源。

PTHREAD_SCOPE_PROCESS(Linux不支持)——在進程范圍內競爭資源

 

六、線程棧末尾的警戒緩沖區大小:guardsize

該屬指定線程末尾的警戒緩沖區大小,在缺省的情況下為一個內存頁(4096字節)

 

七、線程棧的位置:stackaddr

 

八、線程棧的大小:stacksize

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM