2012-06-04 72 views

回答

22

在linux中相當於SetThreadPriority將是pthread_setschedprio(pthread_t thread, int priority)

檢查man page

編輯:這裏的示例代碼相當於:

#include <pthread.h> 

int main() 
{ 
    pthread_t thId = pthread_self(); 
    pthread_attr_t thAttr; 
    int policy = 0; 
    int max_prio_for_policy = 0; 

    pthread_attr_init(&thAttr); 
    pthread_attr_getschedpolicy(&thAttr, &policy); 
    max_prio_for_policy = sched_get_priority_max(policy); 


    pthread_setschedprio(thId, max_prio_for_policy); 
    pthread_attr_destroy(&thAttr); 

    return 0; 
} 

此示例是這是SCHED_OTHER默認的調度策略。

編輯:線程屬性必須在使用前初始化。

+1

你不能一個指針傳遞給未初始化的'pthread_attr_t'到'pthread_attr_getschedpolicy()'。 – caf

+0

@caf感謝您的提示。我更新了代碼片段。 –

+4

請注意,儘管POSIX標準(從提供的「phtread__setschedprio(3)」手冊頁到http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08的鏈接之後。html#tag_02_08_04_01)提到在'SCHED_OTHER'策略中使用'pthread_setschedprio(3)'運行的線程,在Linux中,優先值的值範圍是[[0,0]),使得這個回答在Linux中無用,除非改變爲使用real時間調度類('SCHED_FIFO'或'SCHED_RR'),這個問題沒有被調用。 – FooF

3

pthread_setschedparam()和政策和優先級的組合。

我想你會使用策略SCHED_FIFO, SCHED_RR你可以指定線程的優先級。

16

你想:

#include <pthread.h> 

int main() 
{ 
    int policy; 
    struct sched_param param; 

    pthread_getschedparam(pthread_self(), &policy, &param); 
    param.sched_priority = sched_get_priority_max(policy); 
    pthread_setschedparam(pthread_self(), policy, &param); 

    return 0; 
} 
5

POSIX標準包括pthread_setschedparam(3),通過各種其他的答案中提到。大多數情況下,在討論實時線程時會提到這種POSIX線程庫函數,但POSIX標準並未將其僅用於實時線程領域。但是,在Linux中,如果使用實時調度類SCHED_FIFOSCHED_RR,則它的使用只有真正有意義,因爲只有那些調度類允許多個值用於優先級參數。有關說明,請參見此stack overflow answer

幸運的是,不幸的是,這是一個問題,似乎主流Linux POSIX線程庫實現(過時的LinuxThreads和當前NPTL實現)並不完全符合POSIX標準,因爲「nice value」不是進程具體但特定於線程的參數,因此您可以使用setpriority(3)來更改Linux中線程的好處。此聲明基於pthreads(7)手冊頁中的兼容性說明(在該頁面中搜索「nice value」);我在實踐中沒有經過實際測試(直接做的事)。

如果您決定使用POSIX不符合要求的方式來更改線程的完好性,請注意有人潛意識有人決定修復上述不合規問題,在這種情況下,似乎無法更改線程如果使用普通的調度類(SCHED_OTHER),則在Linux中優先。

0

對於那些可能正在搜索基於BSD的操作系統解決方案(如MacOS或iOS)的用戶,您可能需要考慮使用mach而不是POSIX等效項來設置線程的優先級。

#include <mach/mach_init.h> 
#include <mach/thread_policy.h> 
#include <mach/sched.h> 
#include <pthread.h> 

int set_realtime(int period, int computation, int constraint) { 
    struct thread_time_constraint_policy ttcpolicy; 
    int ret; 
    thread_port_t threadport = pthread_mach_thread_np(pthread_self()); 

    ttcpolicy.period=period; // HZ/160 
    ttcpolicy.computation=computation; // HZ/3300; 
    ttcpolicy.constraint=constraint; // HZ/2200; 
    ttcpolicy.preemptible=1; 

    if ((ret=thread_policy_set(threadport, 
     THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t)&ttcpolicy, 
     THREAD_TIME_CONSTRAINT_POLICY_COUNT)) != KERN_SUCCESS) { 
      fprintf(stderr, "set_realtime() failed.\n"); 
      return 0; 
    } 
    return 1; 
} 

來源:https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html