Linux建立執行緒的屬性設定

2021-08-11 02:07:20 字數 3087 閱讀 8064

如果執行緒呼叫函式: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...