1. 程式人生 > >Linux c 執行緒屬性,執行緒優先順序的修改

Linux c 執行緒屬性,執行緒優先順序的修改

執行緒屬性的設定,網上找的文章總感覺不夠全面,還是結合man手冊檢視。

執行緒屬性設定,分兩個方式,一種是在建立之前,通過pthread_attr_t 結構體傳入,另一種,是執行緒建立完已經在執行時,通過部分函式設定。一般常見的是建立執行緒時傳NULL,使用預設屬性,後續執行時根據需要動態修改,也就第二種方式。

一:執行緒建立前設定屬性:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

1.0 第一個引數,用來儲存建立好後執行緒uid

2.0 第二個引數,即執行緒屬性,通常傳NULL,表示預設屬性,這個屬性在建立前可以設定,包括排程策略,棧大小,優先順序等等

3.0 第三個引數,即執行緒入口函式

4.0 第四個引數,傳給執行緒的引數

所以在建立執行緒前,對 第二個引數 pthred_attr_t 結構體進pthread_attr_t 進行賦值

1.0 pthread_attr_init(pthread_attr_t *attr);//使用預設值填充初始化

2.0//獲取設定棧大小 //這個屬性只能在執行緒建立前設定,後面不能動態修改了

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

3.0 //設定獲取排程策略

SCHED_FIFO, SCHED_RR, and

SCHED_OTHER //policy支援這三種值,

    1.0SCHED_OTHER 分時排程策略,

    2.0SCHED_FIFO實時排程策略,先到先服務

    3.0,SCHED_RR實時排程策略,時間片輪轉 

   SCHED_OTHER(分時排程)是不支援優先順序使用的,其他兩個實時排程可以

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

struct sched_param {

int sched_priority; /* Scheduling priority */

};

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);

5.0//是否分離屬性

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

上面這些都是靜態,在建立執行緒之前的設定。

二:一般,都線上程建立完後,動態地設定:

1.0 設定排程策略和優先順序

#include <sched.h>

int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);

int sched_getscheduler(pid_t pid); //獲取執行緒當前優先順序

struct sched_param {

int sched_priority;

};

//獲取支援的最大最小值

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

2.0 設定分離屬性

int pthread_detach(pthread_t thread);

int pthread_join(pthread_t thread, void **retval);