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