pthread_mutex_init() - mutex オブジェクトの初期化

標準

標準/拡張機能 C/C++ 依存項目

POSIX.4a
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
SUSV3:
#define _UNIX03_THREADS
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t * __restrict__mutex,
                       const pthread_mutexattr_t * __restrict__attr);

機能説明

attr で指定された属性を使用して、mutex によって 参照された mutex を作成します。attr が NULL の場合には、デフォルト mutex 属性 (NONRECURSIVE) が 使用されます。

戻り値

正常に実行された場合、pthread_mutex_init() は 0 を戻し、mutex は初期化され、アンロックされた状態になります。

正常に実行されなかった場合、pthread_mutex_init() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
別の mutex を初期化するために必要なリソース (メモリー以外) が システムにありません。
EBUSY
mutex、すなわち、前に初期化されているが、まだ破棄されていな い mutex によって参照されたオブジェクトを再初期化しようとする試みを検出しました。
EINVAL
attr によって指定された値は無効です。
ENOMEM
ロックを取得するにはメモリーが不十分です。この errno は 専用パスでのみ発生します。
EPERM
操作を実行する権限が呼び出し元にありません。

Single UNIX Specification、バージョン 3 の特殊な動作: 正常に実行されなかった場合、pthread_mutex_init() はエラーを示すエラー番号を戻します。

使用上の注意

_OPEN_SYS_MUTEX_EXT フィーチャー・スイッチをオプションで組み込むことがで きます。 このフィーチャーが設定されると、相当に大きい pthread_mutex_t オブジェ クトが定義されます。 このフィーチャーは、共用メモリー内の mutex と条件変数の管理に使用されます。

提供された拡張 pthread_mutex_t オブジェクトが共用メモリー内にない場合、その オブジェクトは他のプロセスからアクセスできないので、pthread_mutex_init() はその オブジェクトを非共用オブジェクトとして扱います。

pthread_mutex_t オブジェクトは同じコンパイル単位内で定義および初期化するよ うにお勧めします。 初期化される pthread_mutex_t オブジェクトを移動させる場合、初期化コードは、 そのオブジェクトを定義するコードと同じ _OPEN_SYS_MUTEX_EXT フィーチャー設定値で コンパイルされたことを確認してください。

以下の手順を実行すると、ストレージ・オーバーレイが起きて、結果は予測不能に なる可能性があります。
  1. _OPEN_SYS_MUTEX_EXT フィーチャーの #define なしで pthread_mutex_t オブジ ェクトを (共用ストレージ内で) 宣言または定義する。 作成された pthread_mutex_t オブジェクトは標準サイズ (すなわち、小さい) で、 _OPEN_SYS_MUTEX_EXT フィーチャーは定義されません。
  2. pthread_mutex_t オブジェクトを、共用オブジェクトとして初期化するために、 _OPEN_SYS_MUTEX_EXT フィーチャーを定義してコンパイルされた別のコード単位に渡す。 pthread_mutex_t 初期化では、一般的に以下のステップが実行されます。
    1. pthread_mutexattr_init()
    2. pthread_mutexattr_setpshared()。 共用 pthread_mutex_t オブジェクトは小さくてもよいし、拡張サイズでもかまいま せん。 _OPEN_SYS_MUTEX_EXT フィーチャーがあれば、このオブジェクトは拡張サイズとし て宣言されます。
    3. pthread_mutex_init()。 このステップは、渡された (小さい) pthread_mutex_t オブジェクトを拡張オブジェ クトであるかのように初期化し、ストレージ・オーバーレイを起こします。

CELEBP37
⁄* CELEBP37 *⁄                                   
#ifndef _OPEN_THREADS                                                           
#define _OPEN_THREADS                                                           
#endif                                                                          
                                                                                
#include <pthread.h>                                                            
                                                                                
main() {                                                                        
  pthread_mutexattr_t     attr;                                                 
  pthread_mutex_t         mut;                                                  
                                                                                
  if (pthread_mutexattr_init(&attr) == -1) {                                    
    perror("mutexattr_init error");                                             
    exit(1);                                                                    
  }                                                                             
                                                                                
  if (pthread_mutex_init(&mut, &attr) == -1) {                                  
    perror("mutex_init error");                                                 
    exit(2);                                                                    
  }                                                                             
                                                                                
  exit(0);                                                                      
}                                                                               

関連情報