如果執行緒呼叫函式:sleep()函式,就是掛起自己,執行緒掛起,此時cpu的時間片就會分配給其他程序。而如果當前執行緒自己輪詢操作,就會一直使用系統分配給自己的時間片。
對於乙個系統而言:系統會分配給執行緒時間片,同時系統執行排程程式也會花費時間,稱為排程時間。
建立執行緒時的屬性設定
1. 執行緒的排程策略:
sched_othread 非實時排程策略。執行緒優先順序為0,每個執行緒都不搶占其他的執行緒。執行緒會受到時間片的限制。會一直占用系統分配給他的時間片。
sched_rr 實時排程策略。執行緒優先順序1-99,數值越大,優先順序越高。系統分配給乙個執行緒乙個時間片,這個時間片執行過程中不會被打斷。但是當時間片執行結束,下乙個時間片會分給優先順序更高的執行緒。
sched_fifo 實時排程策略。執行緒優先順序1-99,數值越大,優先順序越高。時間片首先分配給優先順序最高的執行緒。一旦時間片分配給乙個執行緒,除非執行緒主動掛起和退出,該執行緒會一直占用cpu。執行緒按照不同的優先順序有不同的執行緒佇列。在乙個佇列中先進先出。
=>實時排程策略會搶占非實時排程策略。除非非實時的執行緒執行結束,否則實時的執行緒是不可能得到執行的。
乙個程序裡面可能有多種排程策略的執行緒。
pthread_attr_t attr;
struct sched_param param;
param._sched_prority = 10;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, sched_rr/sched_fifo);
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(***, &attr, ***, ***);
pthread_attr_destroy(&attr);
2. 執行緒優先順序的作用範圍:
pthread_scope_system 執行緒的優先順序的作用範圍是整個系統。即執行緒和系統中所有的執行緒競爭cpu的時間。
pthread_scope_process 執行緒的優先順序的作用氛圍是當前程序。即執行緒和該程序中其他執行緒競爭cpu時間。
pthread_attr_t attr;
struct sched_param param;
param._sched_prority = 10;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, sched_rr/sched_fifo);
pthread_attr_setschedparam(&attr, ¶m);
pthread_attr_setscope(&attr, pthread_scope_system/pthread_scope_process);
pthread_create(***, &attr, ***, ***);
pthread_destroy(&attr);
3. 執行緒和其他執行緒是否分家:
pthread_create_detached 新執行緒不能用pthread_join函式來同步,而且在退出時自行釋放所占用的資源。
pthread_creatge_joinable 預設值。可以使用pthread_detach(pthread_id)改變分家狀態。
pthread_attr_setdetachstate(&attr, pthread_create_detached);
pthread_attr_setdetachstate(&attr, pthread_create_joinable);
4. 執行緒棧的大小:
棧是執行緒的屬性,在建立執行緒的時候,可以指定棧的大小。但是程式執行的過程中,棧的大小不能改變。即執行緒建立出來,大小就確定。
int stack_size;
pthread_attr_setstacksize(&attr, stack_size);
pthread_attr_getstacksize(&attr, &stack_size);
pthread_stack_min 棧的最小值
以上函式原型:
#include
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
執行緒的棧和程序的堆:
棧是系統自動分配,效率比堆高。(管理堆需要做更多的事,而且據說棧通常會放到告訴快取中)
堆的大小比棧大的多,大小受限於系統有效虛擬記憶體空間。乙個程序的堆的大小不是固定的?是當前申請的堆記憶體的大小。
全域性資料區的大小有系統限制,一般比較大。是固定的?
Linux 之 設定執行緒屬性
typedef struct pthread attr t 設定執行緒屬性首先要建立乙個 pthread attr t 的結構體。然後使用pthread attr init函式對其進行初始化,在使用過後用pthread attr destroy對其進行銷毀。初始化執行緒屬性 int pthread ...
linux多執行緒程式設計2 屬性的設定
屬性設定 屬性結構為pthread attr t,它同樣在標頭檔案 usr include pthread.h中定義 include pthread attr t attr pthread t tid 初始化屬性值,均設為預設值 pthread attr init attr pthread attr...
linux 執行緒 執行緒屬性
typedef struct pthread attr t 這個結構只是為了說明 實際結構具體系統而定 雖然如此我們並不用擔心因為 屬性值不能直接設定,須使用相關函式進行操作 int pthread attr init pthread attr t attr 初始化執行緒屬性 int pthread...