web-dev-qa-db-ja.com

Linux(pthreads)でのSetThreadPriorityと同等

次のコードを考えると、pthreadを想定したり、Boost.Thread APIを使用したりすると、Linuxで同等のコードがどのようになるのか疑問に思いました。

#include <windows.h>

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

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

manページ を確認してください。

編集:これは同等のサンプルコードです:

#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用です。

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

25
Alexandru C.

あなたが欲しい:

#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;
}
18
caf

POSIX標準には、他のさまざまな回答で言及されているように、 pthread_setschedparam(3) が含まれています。ほとんどの場合、このPOSIXスレッドライブラリ関数はリアルタイムスレッドについて言及するときに言及されますが、POSIX標準は、その使用をリアルタイムスレッドのドメインのみに制限していません。ただし、Linuxでは、リアルタイムスケジューリングクラス_SCHED_FIFO_または_SCHED_RR_を使用する場合にのみ、それらのスケジューリングクラスが優先度パラメーターに複数の値を許可するため、その使用は本当に意味があります。説明については、これを参照してください スタックオーバーフローの回答

幸運にも不幸にも、それは視点の問題です。メインストリームのLinux POSIXスレッドライブラリ実装(廃止されたLinuxThreadsと現在のNPTL実装)はどちらも、「Nice value」がプロセス固有ではなく、スレッド固有であるという点でPOSIXに完全には準拠していないようです。パラメータなので、 setpriority(3) を使用してLinuxのスレッドの良さを変更できるようです。この主張は、 pthreads(7) マニュアルページの互換性に関する注意事項に基づいています(そのページで「Nicevalue」を検索してください)。私は実際に実際にテストしていません(簡単なことです)。

スレッドの良さを変更するためにPOSIXに準拠していない方法を使用することにした場合、誰かが前述の非準拠を修正することを決定する可能性があることに注意してください。その場合、Linuxでスレッドの優先順位を変更する方法はないようです。通常のスケジューリングクラス(_SCHED_OTHER_)を使用します。

6
FooF

pthread_setschedparam()のようなものとポリシーと優先度の組み合わせ。

ポリシーを使用すると思いますSCHED_FIFO, SCHED_RRスレッドの優先度を指定できます。

3
stefanB

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

1
blueshogun96