書式
#include <pthread.h>int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind);
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);
説明
mutex の属性は mutex 作成時に、 pthread_mutex_init(3) の第 2 引数として mutex 属性オブジェクトを渡すことで 指定することができる。 NULL を渡すことは、すべての属性がデフォルト値に 設定された mutex 属性オブジェクトを渡すことと同等である。
pthread_mutexattr_init は mutex 属性オブジェクト attr を初期化し、すべての属性をデフォルトの値に設定する。
pthread_mutexattr_destroy は mutex 属性オブジェクトを破壊する。 破壊された mutex 属性オブジェクトは 再び初期化されるまで再使用してはならない。 pthread_mutexattr_destroy は LinuxThreads の実装では何もしない。
LinuxThreads はただ 1 つの mutex 属性に対応している。 それは mutex 種別 (mutex kind) で、 「速い (fast) 」 mutex を表す PTHREAD_MUTEX_FAST_NP か、「再帰的な (recursive) 」 mutex を表す PTHREAD_MUTEX_RECURSIVE_NP 、「エラー検査を行なう (error checking) 」 mutex を表す PTHREAD_MUTEX_ERRORCHECK_NP のいずれかの値をとる。 NP という接尾辞が示すように、 これは POSIX 標準に対するポータブルでない拡張で、 ポータブルなプログラムでは用いるべきでない。
mutex 種別は、 あるスレッドが自分自身で pthread_mutex_lock(3) ですでに保持している mutex をロックしようとしたときに、 何が起こるかを決定する。 mutex が「速い (fast) 」という種別の場合、 pthread_mutex_lock(3) は単に呼び出しスレッドを永遠に停止させる。 mutex が「エラー検査を行なう (error checking) 」という種別の場合、 pthread_mutex_lock(3) はエラーコード EDEADLK とともに直ちに返る。 mutex が「再帰的な (recursive) 」という種別の場合、 pthread_mutex_lock(3) の呼び出しは成功の返り値とともに直ちに返る。 mutex を保持しているスレッドが何回ロックしたかがその mutex に記録される。 保持しているスレッドがロック解除状態に戻るためには、 同じ回数だけ pthread_mutex_unlock(3) を呼び出さなければならない。
デフォルトの mutex 種別は「速い (fast) 」、 すなわち PTHREAD_MUTEX_FAST_NP である。
pthread_mutexattr_settype は attr の mutex 種別を表す属性を kind で示される値に設定する。
pthread_mutexattr_gettype は attr の mutex 種別を表す属性を取得し、 kind で指し示される領域に格納する。
返り値
pthread_mutexattr_init および pthread_mutexattr_destroy 、 pthread_mutexattr_gettype は常に 0 を返す。pthread_mutexattr_settype は成功すると 0 を、エラーの場合非 0 のエラーコードを返す。
エラー
エラーのとき、 pthread_mutexattr_settype は次のようなエラーコードを返す:
- EINVAL
-
kind
が
PTHREAD_MUTEX_FAST_NP
および
PTHREAD_MUTEX_RECURSIVE_NP
、
PTHREAD_MUTEX_ERRORCHECK_NP
のいずれでもない。