pthread_mutexattr_setrobust_np(3T) は、mutex 属性オブジェクトの堅牢度属性を設定します。
#include <pthread.h> int pthread_mutexattr_setrobust_np(pthread_mutexatt_t *attr, int *robustness); |
pthread_mutexattr_setrobust_np() が適用されるのは、シンボル _POSIX_THREAD_PRIO_INHERIT が定義されている場合だけです。
attr は、先の pthread_mutexattr_init() の呼び出しによって作成された mutex 属性オブジェクトを指します。
robustness は、mutex の所有者が終了した場合の動作を定義します。pthread.h に定義可能な robustness の値は、 PTHREAD_MUTEX_ROBUST_NP または PTHREAD_MUTEX_STALLED_NP です。デフォルト値は、PTHREAD_MUTEX_STALLED_NP です。
PTHREAD_MUTEX_ROBUST_NP
mutex の所有者が終了すると、それ以降の pthread_mutex_lock() へのすべての呼び出しは、指定しない方法で進行過程からブロックされます。
PTHREAD_MUTEX_STALLED_NP
mutex の所有者が終了すると、mutex はロック解除されます。この mutex の次の所有者が獲得し、エラーコード EOWNERDEAD が返されます。
作成するアプリケーションは、このタイプの mutex について、pthread_mutex_lock() から出力される戻りコードをチェックする必要があります。
この mutex の新しい所有者は、mutex によって保護されている状態を整合させる必要があります。これは、前の所有者が終了したときに状態が不整合のままになっている可能性があるためです。
新しい所有者が状態を整合できる場合は、その mutex に対して pthread_mutex_consistent_np() を呼び出して、mutex をロック解除します。
新しい所有者が状態を整合できない場合は、その mutex に対して pthread_mutex_consistent_np() を呼び出さずに、mutex をロック解除してください。
すべての待機者が呼び起こされ、それ以降の pthread_mutex_lock() へのすべての呼び出しは mutex の獲得に失敗し、エラーコード ENOTRECOVERABLE を返します。この時点で、pthread_mutex_destroy() を呼び出して mutex を削除し、pthread_mutex_int() を呼び出して初期化し直すことによって、mutex の状態を整合させることができます。
EOWNERDEAD を持つロックを獲得したスレッドが終了すると、次の所有者がリターンコード EOWNERDEAD を持つロックを獲得します。
pthread_mutexattr_setrobust_np() は、正常終了すると 0 を返します。それ以外の戻り値は、エラーが発生したことを示しています。
次の条件のいずれかが検出されると、pthread_mutexattr_setrobust_np() は失敗し、対応する値を返します。
オプション _POSIX_THREAD_PRIO__INHERIT が定義されていないか、あるいはこの実装が pthread_mutexattr_setrobust_np() 関数をサポートしていません。
robustness で指定された値はサポートされていません。
次の条件が検出されると、pthread_mutexattr_setrobust_np() は失敗します。