1. 程式人生 > >pthread設置線程的優先級

pthread設置線程的優先級

for 屬性 nor HR 決定 pro 開發 user 阻塞

pthread_setschedparam 語法

int pthread_setschedparam(pthread_t tid, int policy,const struct sched_param *param);
在多線程開發中經常被使用的,它主要用於設置線程的調用策略和優先級。在介紹它的使用方法之前,我們先簡單的介紹一下它的使用參數。

1. tid是使用pthread_create所獲得的線程ID。

2.線程的調度有三種策略:SCHED_OTHER、SCHED_RR和SCHED_FIFO。Policy用於指明使用哪種策略。下面我們簡單的說明一下這三種調度策略。

SCHED_OTHER

它是默認的線程分時調度策略,所有的線程的優先級別都是0,線程的調度是通過分時來完成的。簡單地說,如果系統使用這種調度策略,程序將無法設置線程的優先級。請註意,這種調度策略也是搶占式的,當高優先級的線程準備運行的時候,當前線程將被搶占並進入等待隊列。這種調度策略僅僅決定線程在可運行線程隊列中的具有相同優先級的線程的運行次序。

SCHED_FIFO

它是一種實時的先進先出調用策略,且只能在超級用戶下運行。這種調用策略僅僅被使用於優先級大於0的線程。它意味著,使用SCHED_FIFO的可運行線程將一直搶占使用SCHED_OTHER的運行線程J。此外SCHED_FIFO是一個非分時的簡單調度策略,當一個線程變成可運行狀態,它將被追加到對應優先級隊列的尾部((POSIX 1003.1)。當所有高優先級的線程終止或者阻塞時,它將被運行。對於相同優先級別的線程,按照簡單的先進先運行的規則運行。我們考慮一種很壞的情況,如果有若幹相同優先級的線程等待執行,然而最早執行的線程無終止或者阻塞動作,那麽其他線程是無法執行的,除非當前線程調用如pthread_yield之類的函數,所以在使用SCHED_FIFO

的時候要小心處理相同級別線程的動作。

SCHED_RR

鑒於SCHED_FIFO調度策略的一些缺點,SCHED_RRSCHED_FIFO做出了一些增強功能。從實質上看,它還是SCHED_FIFO調用策略。它使用最大運行時間來限制當前進程的運行,當運行時間大於等於最大運行時間的時候,當前線程將被切換並放置於相同優先級隊列的最後。這樣做的好處是其他具有相同級別的線程能在“自私“線程下執行。

3.param是struct sched_param類型的指針,它僅僅包含一個成員變sched_priority,指明所要設置的靜態線程優先級。

pthread_setschedparam 返回值

pthread_setschedparam()

在成功完成之後返回零。其他任何返回值都表示出現了錯誤。如果出現以下任一情況,pthread_setschedparam() 函數將失敗並返回相應的值。

EINVAL

描述:

所設置屬性的值無效。


ENOTSUP

描述:

嘗試將該屬性設置為不受支持的值。

eg:

int WYQThread_SetPrority( pthread_t tid, int prority )
{
// Check parameters
assert( tid > 0 );
if ( tid <= 0 )
{
    printf( “Invalid thread’s id(%ld)\n”, (long) tid );
    return EINV;
}
assert(prority >= 0 && prority <= 99 );
if (prority < 0 || prority > 99 )
{
    printf( “Invalid thread’s prority(%ld)\n”, (long) prority );
    return EINV;
}
 
// Set thread’s prority
if ( prority != 0 ) // We use SCHED_FIFO or SCHED_RR
{
    // Check whether user is root
if ( geteuid() == 0 )
{
    struct sched_param sched;
   
    sched.sched_priority = prority;
   
    // We use RR to act as the default scheduler
    return pthread_setschedparam( tid, SCHED_RR, &sched );
}
// We don’t support user mode for static prority’s scheduler, so ignore it
}
 
return 0;
}

它有很多改進的地方,比如可以使用虛優先級(在程序中加入虛實影射表)等

pthread設置線程的優先級