次のコードを考えると、pthreads を想定したり、Boost.Thread API を使用したりすると、Linux で同等のコードがどのようなものになるのか疑問に思いました。
#include <windows.h>
int main()
{
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
return 0;
}
SetThreadPriority
Linux での に相当するのはpthread_setschedprio(pthread_t thread, int priority)
.
マニュアルページを確認してください。
編集:これに相当するサンプルコードは次のとおりです。
#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 であるデフォルトのスケジューリング ポリシー用です。
編集: 使用前にスレッド属性を初期化する必要があります。
あなたがしたい:
#include <pthread.h>
int main()
{
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
param.sched_priority = sched_get_priority_max(policy);
pthread_setschedparam(pthread_self(), policy, ¶m);
return 0;
}
POSIX標準にはpthread_setschedparam(3)
、他のさまざまな回答で言及されているように、が含まれています。ほとんどの場合、この POSIX スレッド ライブラリ関数は、リアルタイム スレッドについて言及する際に言及されますが、POSIX 標準は、その使用をリアルタイム スレッドの領域だけに制限していません。ただし、Linux では、リアルタイム スケジューリング クラスを使用する場合、SCHED_FIFO
またはSCHED_RR
これらのスケジューリング クラスのみが優先度パラメーターに複数の値を許可する場合にのみ、その使用が本当に意味を持ちます。図については、このスタック オーバーフローの回答を参照してください。
幸か不幸か、それは視点の問題です。メイン ストリームの Linux POSIX スレッド ライブラリの実装 (廃止された LinuxThreads と現在の NPTL 実装) の両方が、「適切な値」がプロセス固有ではなくスレッド固有であるという点で、完全には POSIX に準拠していないようです。パラメーターなのでsetpriority(3)
、Linux でスレッドのナイスネスを変更するために使用できるようです。この主張は、マニュアル ページの互換性に関する注意事項に基づいていpthreads(7)
ます (そのページで「nice value」を検索してください)。私は実際に実際にテストしていません(簡単なことです)。
スレッドのナイスネスを変更するために POSIX 非準拠の方法を使用することに決めた場合、言及された非準拠を誰かが修正することを決定する潜在的な可能性があることに注意してください。通常のスケジューリング クラス ( SCHED_OTHER
) を使用します。
pthread_setschedparam()
ポリシーと優先順位のようなものと組み合わせ。
SCHED_FIFO, SCHED_RR
スレッドの優先度を指定できるポリシーを使用すると思います。
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;
}