#include <pthread.h> int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);
attr は、先の pthread_mutexattr_init() の呼び出しによって作成された mutex 属性オブジェクトを指します。
protocol には、mutex 属性オブジェクトに適用されるプロトコルを指定します。
pthread.h に定義されている protocol の値は、次の値のうちのいずれか 1 つです。 PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT、または PTHREAD_PRIO_PROTECT です。
PTHREAD_PRIO_NONE
PTHREAD_PRIO_INHERIT
このプロトコル値は、所有しているスレッドの優先順位とスケジューリングに影響します。より優先順位の高いスレッドが thrd1 の所有する 1 つまたは複数の mutex 上でブロックされている場合、これらの mutex が PTHREAD_PRIO_INHERIT を使用して初期化されていると、thrd1 はより高い優先順位、すなわち thrd1 が所有する mutex を待っているスレッドの最高優先順位で実行されます。
thrd1 が別のスレッド thrd3 が所有する mutex をブロックしている場合、同様の優先順位継承効果が thrd3 に対して再帰的に伝播されます。
優先順位の逆転を避けるには、 PTHREAD_PRIO_INHERIT を使用します。優先順位の低いスレッドが、そのスレッドより優先順位の高いスレッドが必要としているロックを保持していると、優先順位が逆転します。優先順位の高いスレッドは、優先順位の低いスレッドがロックを解除するまで実行を続行できません。
優先順位の継承を使用しない場合は、優先順位の低いスレッドが長期間実行をスケジュールされないために、優先順位の高いスレッドが同じ期間ブロックされる可能性があります。優先順位の継承では、優先順位の低いスレッドの優先順位を一時的に上げることによって、そのスレッドがすばやく実行をスケジュールされてロックを解放し、それによって優先順位の高いスレッドがそのロックを獲得できるようにします。優先順位の低いスレッドは、ロックを解放すると、元の低い優先順位に戻ります。
PTHREAD_PRIO_PROTECT
スレッドが PTHREAD_PRIO_PROTECT で初期化された mutex を 1 つ以上所有している場合、このプロトコル値は、スレッド (thrd2 など) の優先順位とスケジューリングに影響します。thrd2 は、より高い優先順位または自分が所有しているすべての mutex の中でもっとも高い優先順位で実行します。thrd2 が所有するいずれかの mutex でブロックされているより優先度の高いスレッドは、thrd2 のスケジューリングには影響を与えません。
PTHREAD_PRIO_INHERIT および PTHREAD_PRIO_PROTECT mutex 属性を使用できるのは、リアルタイム (RT) スケジューリングクラス SCHED_FIFO または SCHED_RR で実行されている特権付きプロセスだけです。
スレッドは、 PTHREAD_PRIO_INHERIT で初期化された mutex と PTHREAD_PRIO_PROTECT で初期化された mutex を複数同時に所有できます。この場合、スレッドは、これらのプロトコルのいずれかで獲得された最高の優先順位で実行します。