名称
pthread_mutex_init(), pthread_mutex_destroy() ― mutex の初期化と消去
構文
#include <pthread.h>
int pthread_mutex_init(
pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr
);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_destroy(
pthread_mutex_t *mutex
);
パラメータ
| mutex | | 初期化または消去する mutex へのポインター。 |
| attr | | 初期化する mutex の特性を定義する属性オブジェクトへのポインター。
ポインターが NULL の場合、デフォルトの属性が使用されます。 |
説明
pthread_mutex_init() 関数は、 mutex で指定された mutex を属性 attr で初期化します。 パラメータ attr が NULL の場合、デフォルトの mutex 属性が使用されます。
デフォルトの mutex 属性の一覧は、 pthread_mutexattr_init(3T) を参照してください。 初期化が正常終了すると、mutex は初期化され、ロックが解除されて、mutex 操作関数で使用する準備ができます。
mutex の初期化は一度だけにする必要があります。それ以外の場合、どのような動作が生じるかは不定です。 pthread_once() 関数は、mutex が一度だけ初期化されていることを確実にする方法を提供します。
マクロ PTHREAD_MUTEX_INITIALIZER は、静的に割り当てられた mutex を初期化するために使用することができます。
この場合、mutex はデフォルトの属性で初期化されます。 静的に初期化された mutex には、 pthread_mutex_init() 関数を使用する必要はありません。
attr で参照される mutex 属性オブジェクトのプロセス共有属性が PTHREAD_PROCESS_SHARED で定義されている場合、mutex は、mutex を共有するプロセスからアクセスできるように割り当てられなければなりません。
これは、メモリーマップ関数 mmap(2) 参照)、または共有メモリー関数 shmget(2) 参照) によって実行することができます。
pthread_mutex_destroy() 関数は、 mutex で参照される mutex を消去します。 この関数は、 mutex に無効な値を設定する可能性があります。 消去された mutex は、関数 pthread_mutex_init() を使用して、再度初期化することができます。消去後、 mutex 関数で mutex を使用すると、どのような動作が生じるかは不定です。
mutex の消去は、ロックが解除されているときにのみ行う必要があります。
現在使用されている mutex を消去すると、不定の動作が生じる結果になります。
戻り値
正常終了すると pthread_mutex_init() と pthread_mutex_destroy() は 0 を返します。
それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。
エラー
以下の現象が発生した場合、 pthread_mutex_init() 関数は、該当するエラー番号を返します。
| [EAGAIN] | | mutex を初期化するために必要なリソース (メモリー以外) が使用できない場合。 |
| [ENOMEM] | | mutex の初期化で使用可能なメモリー領域が足りない場合。 |
| [EPERM] | | 呼び出し元に、mutex を初期化するのに必要なパーミッションがない場合。 |
以下の条件の場合、 pthread_mutex_init() 関数は、該当するエラー番号を返します。
| [EINVAL] | | mutex または attr で指定された値が無効な場合。 |
| [EBUSY] | | mutex がすでに初期化済みの mutex の場合。 |
| [EFAULT] | | mutex パラメータが、無効なアドレスを指している場合。 |
以下の条件の場合、 pthread_mutex_destroy() 関数は、該当するエラー番号を返します。
| [EINVAL] | | mutex が、有効な mutex でない場合。 |
| [EBUSY] | | mutex が現在ロックされているか、別のスレッドによって使用中の場合。 |
警告
mutex 用の領域は、 pthread_mutex_init() 呼び出しの前に割り当てなければなりません。 attr の プロセス共有 属性が PTHREAD_PROCESS_SHARED であり、mutex 用に割り当てられている領域が協調スレッドからアクセスできない場合、結果は不定になります。
著者
pthread_mutex_init() と pthread_mutex_destroy() は、IEEE
POSIX P1003.1c 規格から派生しました。
標準準拠
pthread_mutex_init(): POSIX 1003.1c.
pthread_mutex_destroy(): POSIX 1003.1c.