マルチスレッドのプログラミング

mutex 属性オブジェクトの初期化

mutex オブジェクトに関連付けられた属性をデフォルト値に初期化するには、pthread_mutexattr_init(3C) を使用します。各属性オブジェクトのための記憶領域は、実行時にスレッドシステムによって割り当てられます。

pthread_mutexattr_init の構文

int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
#include <pthread.h>

pthread_mutexattr_t mattr;
int ret;

/* initialize an attribute to default value */
ret = pthread_mutexattr_init(&mattr); 

mattr不透明な型で、システムによって割り当てられた属性オブジェクトを格納します。mattr オブジェクト内の属性については、表 4–2 を参照してください。

mutex 属性オブジェクトを再度初期化する場合は、あらかじめ pthread_mutexattr_destroy(3C) を呼び出して、オブジェクトを削除しておく必要があります。pthread_mutexattr_init() を呼び出すと、不透明なオブジェクトが割り当てられます。そのオブジェクトが削除されないと、結果的にメモリーリークを引き起こします。

表 4–2 mattr のデフォルトの属性値

属性 

値 

結果 

pshared

PTHREAD_PROCESS_PRIVATE

初期化された mutex を 1 つのプロセス内で使用できます。その mutex を操作できるのは同じプロセスで生成されたスレッドだけです。 

type

PTHREAD_MUTEX_DEFAULT

Solaris Pthreads 実装では、PTHREAD_MUTEX_DEFAULT は、デッドロックを検出しない PTHREAD_MUTEX_NORMAL に割り当てられます。

プロトコル

PTHREAD_PRIO_NONE

スレッドの優先順位とスケジューリングは、そのスレッドが所有する mutex の優先順位の影響を受けません。 

prioceiling

– 

prioceiling の値は、sched_get_priority_min() および sched_get_priority_max() 関数によって返される、SCHED_FIFO 方針に関する既存の優先順位の範囲から取得されます。この優先順位の範囲は、mutex が作成された Solaris バージョンによって決定されます。

robustness

PTHREAD_MUTEX_STALLED_NP

mutex の所有者が終了すると、この mutex に関する pthread_mutex_lock() への将来のすべての呼び出しは進行過程からブロックされます。

pthread_mutexattr_init の戻り値

pthread_mutexattr_init() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、この関数は失敗し、次の値を返します。


ENOMEM

説明:

メモリー不足のため、mutex 属性オブジェクトを初期化できません。