pthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_settype,
pthread_mutexattr_gettype - mutex
作成時の属性
#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
のいずれでもない。
Xavier Leroy <
[email protected]>
pthread_mutex_init(3),
pthread_mutex_lock(3),
pthread_mutex_unlock(3).
[訳注1] glibc-linuxthreads
の最新のドキュメントは
Texinfo
形式で提供されている。
上の記述は glibc-linuxthreads-2.2
以降では正しくない。
以下は glibc-linuxthreads-2.3.1 の Texinfo
ファイルからの引用である。
種別 (kind) が型 (type)
に変更されている。
LinuxThreads はただ 1 つの mutex
属性に対応している。
それは mutex 型 (mutex type) で、
「速い (fast) 」 mutex を表す
PTHREAD_MUTEX_ADAPTIVE_NP
か、「再帰的な (recursive) 」
mutex を表す
PTHREAD_MUTEX_RECURSIVE_NP
、「時刻情報つき (timed)
」 mutex を表す
PTHREAD_MUTEX_TIMED_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
型は「時刻情報つき
(timed) 」、 すなわち
PTHREAD_MUTEX_TIMED_NP である。
[訳注2] LinuxThreads では mutex
をプロセス間で共有することはできない。
glibc-linuxthreads-2.2 以降、次の 2
つの関数が追加されている。
int pthread_mutexattr_getpshared(const pthread_mutexattr_t
*attr, int *pshared);
pshared
で指し示される領域に
PTHREAD_PROCESS_PRIVATE
を格納し、常に 0
を返す。
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int
pshared);
pshared が
PTHREAD_PROCESS_PRIVATE および
PTHREAD_PROCESS_SHARED
のいずれでもない場合、
EINVAL を返す。
pshared が
PTHREAD_PROCESS_SHARED の場合、
ENOSYS
を返す。
それ以外の場合、 0
を返す。