在linux中,可以使用pthread_attr_t結構修改線程默認屬性,並把這些屬性與創建的線程聯系起來。首先調用pthread_attr_init初始化pthread_attr_t結構,使pthread_attr_t結構所包含的內容就是操作系統實現支持的線程所有屬性的默認值。然後,可以調用其他函數對想修改的個別屬性進行修改。
1.線程屬性的初始化(若對屬性操作,必先初始化),去初始化。
#include <pthread.h>
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_init(pthread_attr_t *attr);
返回值:若成功返回0,否則返回錯誤編號。
2.獲取分離狀態/設置分離屬性
#include <pthread.h>
int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
返回值:若成功返回0,否則返回錯誤編號。
設置PTHREAD_CREATE_DETACHED,以分離狀態啟動線程;或設置為PTHREAD_CREATE_JOINABLE,默認正常啟動線程,應用程序可以獲取線程的終止狀態。
3.獲取/設置調度策略
#include <pthread.h>
int pthread_attr_getschedpolicy(const pthread_attr_t *restrict attr,
int *restrict policy);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
返回值:若成功返回0,否則返回錯誤編號。
The supported values of policy shall include SCHED_FIFO, SCHED_RR, and SCHED_OTHER, which are defined in the <sched.h> header.
POSIX 標准指定了三種調度策略:先入先出策略 (SCHED_FIFO)、循環策略 (SCHED_RR) 和自定義策略 (SCHED_OTHER)。SCHED_FIFO 是基於隊列的調度程序,對於每個優先級都會使用不同的隊列。SCHED_RR 與 FIFO 相似,不同的是前者的每個線程都有一個執行時間配額。
SCHED_FIFO 和 SCHED_RR 是對 POSIX Realtime 的擴展。SCHED_OTHER 是缺省的調度策略。
SCHED_FIFO
如果調用進程具有有效的用戶 ID 0,則爭用范圍為系統 (PTHREAD_SCOPE_SYSTEM) 的先入先出線程屬於實時 (RT) 調度類。如果這些線程未被優先級更高的線程搶占,則會繼續處理該線程,直到該線程放棄或阻塞為止。對於具有進程爭用范圍 (PTHREAD_SCOPE_PROCESS)) 的線程或其調用進程沒有有效用戶 ID 0 的線程,請使用 SCHED_FIFO。SCHED_FIFO 基於 TS 調度類。
SCHED_RR
如果調用進程具有有效的用戶 ID 0,則爭用范圍為系統 (PTHREAD_SCOPE_SYSTEM)) 的循環線程屬於實時 (RT) 調度類。如果這些線程未被優先級更高的線程搶占,並且這些線程沒有放棄或阻塞,則在系統確定的時間段內將一直執行這些線程。對於具有進程爭用范圍 (PTHREAD_SCOPE_PROCESS) 的線程,請使用 SCHED_RR(基於 TS 調度類)。此外,這些線程的調用進程沒有有效的用戶 ID 0。
SCHED_FIFO 和 SCHED_RR 在 POSIX 標准中是可選的,而且僅用於實時線程。
4.獲取/設置