相互排他ロック (mutex ロック) は、スレッドの実行を直列化したいときに使用します。相互排他ロックでスレッド間の同期をとるときは、通常はコードの危険領域が複数のスレッドによって同時に実行されないようにするという方法が用いられます。単一のスレッドのコードを保護する目的で相互排他ロックを使用することもできます。
デフォルトの mutex 属性を変更するには、属性オブジェクトを宣言して初期化します。mutex 属性は、すばやく見つけて簡単に変更できるよう、通常はアプリケーションの先頭部分の一箇所で設定します。次の表に、この節で説明する mutex 属性操作関数を示します。
表 4-1 mutex 属性ルーチン
mutex のスコープ定義について、Solaris と POSIX との相違点を表 4-2 に示します。
表 4-2 mutex の比較
Solaris |
POSIX |
定義 |
---|---|---|
USYNC_PROCESS |
PTHREAD_PROCESS_SHARED |
このプロセスと他のプロセスのスレッドの間で同期をとるために使用する |
USYNC_THREAD |
PTHREAD_PROCESS_PRIVATE |
このプロセスのスレッドの間でだけ同期をとるために使用する |
pthread_mutexattr_init() は、このオブジェクトに関連付けられた属性をデフォルト値に初期化します。各属性オブジェクトのための記憶領域は、実行時にスレッドによって割り当てられます。
この関数が呼び出されたときの pshared 属性のデフォルト値は PTHREAD_PROCESS_PRIVATE で、初期化された mutex を 1 つのプロセスの中だけで使用できるという意味です。
プロトタイプ: int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
#include <pthread.h> pthread_mutexattr_t mattr; int ret; /* 属性をデフォルト値に初期化する */ ret = pthread_mutexattr_init(&mattr);
mattr は不透明な型で、システムによって割り当てられた属性オブジェクトを指定します。mattr のスコープとして取りうる値は、PTHREAD_PROCESS_PRIVATE (デフォルト) と PTHREAD_PROCESS_SHARED です。
mutex 属性オブジェクトを再使用するには、pthread_mutexattr_destroy(3T) によって事前に削除しなければなりません。pthread_mutexattr_init() 呼び出しは、不透明なオブジェクト型へのポインタを戻します。そのオブジェクトが削除されないと、結果的にメモリーリークを引き起こします。
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、この関数は失敗し、次の値を戻します。
pthread_mutexattr_destroy() は、pthread_mutexattr_init() によって生成された属性オブジェクトの管理に使用されていた記憶領域の割り当てを解除します。
プロトタイプ: int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)
#include <pthread.h> pthread_mutexattr_t mattr; int ret; /* 属性を削除する */ ret = pthread_mutexattr_destroy(&mattr);
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を戻します。
mutex 変数の値は、プロセス専用 (プロセス内) とシステム共通 (プロセス間) のどちらかです。pshared 属性を PTHREAD_PROCESS_SHARED 状態に設定して mutex を生成し、その mutex が共有メモリー内に存在する場合、その mutex は複数のプロセスのスレッドの間で共有できます。これは、オリジナルの Solaris スレッドにおいて mutex_init() で USYNC_PROCESS フラグを使用するのに相当します。
プロトタイプ: int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
#include <pthread.h> pthread_mutexattr_t mattr; int ret; ret = pthread_mutexattr_init(&mattr); /* * デフォルト値にリセットする: private */ ret = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE);
mutex の pshared 属性を PTHREAD_PROCESS_PRIVATE に設定した場合、その mutex を操作できるのは同じプロセスで生成されたスレッドだけです。
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を戻します。
プロトタイプ: int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int *pshared);
#include <pthread.h> pthread_mutexattr_t mattr; int pshared, ret; /* mutex の pshared を取得する */ ret = pthread_mutexattr_getpshared(&mattr, &pshared);
属性オブジェクト mattr の pshared の現在値を取得します。これは PTHREAD_PROCESS_SHARED と PTHREAD_PROCESS_PRIVATE のどちらかです。
正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を戻します。