pthread_mutexattr_setrobust_np(3C) は、mutex 属性オブジェクトの堅牢度属性を設定します。
#include <pthread.h> int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr, int *robustness);
pthread_mutexattr_setrobust_np() が適用されるのは、シンボル _POSIX_THREAD_PRIO_INHERIT が定義されている場合だけです。
Solaris 10 および以前のリリースでは、PTHREAD_MUTEX_ROBUST_NP 属性は、自身も PTHREAD_PRIO_INHERIT プロトコル属性でマークされている mutex にのみ適用できます。この制限は、それ以降の Solaris リリースでは解消されています。
attr は、先の pthread_mutexattr_init() の呼び出しによって作成された mutex 属性オブジェクトを指します。
robustness は、mutex の所有者が (通常はプロセスが異常終了したために) mutex をロック解除しないで終了した場合の動作を定義します。pthread.h に定義可能な robustness の値は、PTHREAD_MUTEX_ROBUST_NP または PTHREAD_MUTEX_STALLED_NP です。デフォルト値は、PTHREAD_MUTEX_STALLED_NP です。
PTHREAD_MUTEX_STALLED_NP
mutex の所有者が mutex をロック解除しないで終了すると、それ以降の pthread_mutex_lock() へのすべての呼び出しは、指定しない方法で進行過程からブロックされます。
PTHREAD_MUTEX_ROBUST_NP
mutex の所有者が mutex をロック解除しないで終了すると、mutex はロック解除されます。この mutex の次の所有者がその mutex を獲得し、エラーコード EOWNERDEAD が返されます。
アプリケーションは pthread_mutex_lock() からのリターンコードを常にチェックして、PTHREAD_MUTEX_ROBUST_NP 属性で初期化された mutex がないかどうかを確認する必要があります。
この mutex の新しい所有者は、mutex によって保護されている状態を整合させる必要があります。これは、前の所有者が終了したときに状態が不整合のままになっている可能性があるためです。
新しい所有者が状態を整合できる場合は、その mutex に対して pthread_mutex_consistent_np() を呼び出してから mutex をロック解除します。これによって mutex は整合性があるとしてマークされるため、以降の pthread_mutex_lock() および pthread_mutex_unlock() の呼び出しが通常の方法で動作します。
新しい所有者が状態を整合できない場合は、その mutex に対して pthread_mutex_consistent_np() を呼び出さずに、mutex をロック解除してください。
すべての待機者が呼び起こされ、それ以降の pthread_mutex_lock() へのすべての呼び出しは mutex の獲得に失敗し、エラーコード ENOTRECOVERABLE を返します。この時点で、pthread_mutex_destroy() を呼び出して mutex を削除し、pthread_mutex_int() を呼び出して初期化し直すことによって、mutex の状態を整合させることができます。ただし、この mutex によって保護されていた状態は不整合のままになるため、何らかの形式のアプリケーション復旧が必要になります。
EOWNERDEAD を持つロックを獲得したスレッドが mutex をロック解除しないで終了すると、次の所有者が EOWNERDEAD のリターンコードを持つロックを獲得します。
pthread_mutexattr_setrobust_np() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。
次の条件が検出されると、pthread_mutexattr_setrobust_np() は失敗する可能性があります。
EINVAL
説明:attr または robustness で指定された値は無効です。