Solaris スレッドでは、優先順位が親と異なるスレッドを生成する場合、SUSPEND モードで生成します。そして、停止状態のときに thr_setprio(3T) 関数を使ってスレッド優先順位を変更し、実行を再開します。
通常、非結合スレッドのスケジューリングは、プロセス内の他のスレッドとの関係だけを考慮した単純な優先順位に基づいて行われます。その他の調整が行われたり、カーネルが関係したりすることはありません。スレッドの優先順位は通常は同一であり、生成側プロセスの優先順位を継承します。
thr_setprio(3THR) は、現在のプロセス内の tid で指定したスレッドの優先順位を、newprio で指定した優先順位に変更します。(POSIX スレッドについては、「pthread_setschedparam(3THR)」を参照)。
#include <thread.h> int thr_setprio(thread_t tid, int newprio) |
スレッドのスケジューリングは、デフォルトの設定では、最低の優先順位を表す 0 から最大整数までの範囲の固定的な優先順位に基づいて行われます。tid で指定されたスレッドは、自分より優先順位の低いスレッドから実行リソースを横取りし、自分より優先順位の高いスレッドには実行リソースを譲ります。
thread_t tid; int ret; int newprio = 20; /* 停止状態のスレッドを生成する */ ret = thr_create(NULL, NULL, func, arg, THR_SUSPEND, &tid); /* 停止状態の子スレッドに対して新しい優先順位を設定する */ ret = thr_setprio(tid, newprio); /* 停止状態の子スレッドを新しい優先順位で開始する */ ret = thr_continue(tid); |