線程屬性
創建線程函數
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