Silphireの日記: pthread日記(49) - pthread_mutexattr_setprotocol()
Mutex属性オブジェクトのprotocol属性の値を設定します。
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);
pthread_mutexattr_setprotocol()は、attrが参照するMutex属性オブジェクトの値をprotocolが示す値に設定します。
protocol属性の値は、pthread.hで定義されているPTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_PROTECTのいずれかの値をとります。
スレッドがprotocol属性にPTHREAD_PRIO_NONEを持ったMutexを所有している時、スレッドのプライオリティやスケジューリングはMutexの所有権に影響されません。
1つ以上の、(protocolが)PTHREAD_PRIO_PROTECTで初期化されたMutexを持つスレッドは、 他のスレッドがこれらのMutexのうちのどの上でブロックされるか否かに関係なく、 このスレッドにより所有されるすべてのMutexの優先度が、自身より高いものか最も高いもので実行し、 この属性で初期化されます。
スレッドが(protocolを)PRIO_INHERITかPRIO_PROTECTで初期化されたMutexを保持しているとき、 そのオリジナルの優先度が変更された場合に、sched_setparam()が呼び出された時のようにスケジューリングキューの後部に移動されることはありません。 同様に、スレッドがPRIO_INHERITかPRIO_PROTECTで初期化された(protocolを持つ)Mutexをアンロックするとき、 そのオリジナルの優先度が変更された場合に、スケジューリングキューの後部に移動されることはありません。
もしスレッドが一斉にいくつかの違うprotocolで初期化されたMutexを所有すると、それらのprotocolの中で最も高い優先度のものを実行するでしょう。
スレッドがpthread_mutex_lock()への呼出しを行うと、 _POSIX_THREAD_PRIO_INHERITが定義されていてかつMutexのprotocol属性がPTHREAD_PRIO_INHERITで初期化されている場合には、呼出し側スレッドはMutexが別のスレッドにより所有されているためブロックされます。Mutexを所有しているスレッドがそのままMutexを所有し続ける限り、呼出しスレッドの優先度を継承するでしょう。 実装では、最大に割り当てられた実行優先度と全ての継承された優先度を更新します。 更に、この所有スレッドが別のMutex上でブロックされた場合には、同じ優先度継承の結果が再帰的なやり方で他の所有スレッドに広がるでしょう。
pthread_mutexattr_setprotocol()が成功した時には0を返します。エラーの時はエラーに応じた値を返します。
今回の日記は、crackbrainさんに依る所が非常に多くなっています。どうもありがとうございました。
pthread日記(49) - pthread_mutexattr_setprotocol() More ログイン