2012-06-04 25 views
12

次のコードでは、pthreadsを仮定しているか、Boost.Thread APIを使用していてもlinuxのコードと同じものが何であるか疑問に思っていました。SetThreadPriorityと同等のLinux(pthreads)

#include <windows.h> 

int main() 
{ 
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); 
    return 0; 
} 

答えて

22

linuxのSetThreadPriorityに相当するのはpthread_setschedprio(pthread_t thread, int priority)です。

man pageを確認してください。

EDIT:

#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デフォルトのスケジューリングポリシーのためである:ここでのサンプルコードと同等です。

EDIT:使用前にスレッド属性を初期化する必要があります。

+1

あなたが 'は、pthread_attr_getschedpolicy()'に初期化されていない 'pthread_attr_t'へのポインタを渡すことはできません。 – 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] 'です。 (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_FIFOまたはSCHED_RRを使用する場合、スケジューリングクラスだけがpriorityパラメータに複数の値を許可するので、その使用は実際には意味があります。図解については、stack overflow answerを参照してください。

幸いにも、それは遠近法の問題です。Linux POSIXスレッドライブラリの主流(古いLinuxThreadsと現在のNPTL実装)の両方が完全にPOSIXに準拠しているわけではありません。スレッド固有のパラメータであるため、setpriority(3)を使用して、Linuxのスレッドのnicenessを変更することができます。このクレームはpthreads(7)マニュアルページの互換性ノートに基づいています(そのページの "nice value"を検索してください)。私は実際には実際にテストしていない(簡単なこと)。

スレッドのニーネスを変更するには、POSIX準拠の方法を使用することにしてください。誰かが上記の非準拠を修正することを決定する潜在的な可能性があります。その場合、スレッドを変更する方法はないようです通常のスケジューリングクラス(SCHED_OTHER)を使用している場合、Linuxの優先順位。

0

MacOSやiOSなどのBSDベースのOSソリューションを探している人は、必要に応じてPOSIXの代わりにMachを使ってスレッドの優先度を設定することを検討してください。

#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