pthread_mutex_lock() - mutex オブジェクトへのロックの待機

標準

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

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

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);
SUSV3:
#define _UNIX03_THREADS
#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);

機能説明

mutex を識別する mutex オブジェクトをロックします。mutex は、共用リソースを保護する場合に使用されます。mutex が既に別のスレッドによってロックされている場合には、スレッドは mutex が使用可能になるのを待機します。mutex をロックしたスレッドはその現行所有者になり、そのスレッドがその 所有者をアンロックするまで所有者になったままです。

mutex が再帰的属性を持つ場合、そのロックの使用法は異なることがあります。この種の mutex が同じスレッドによって複数回ロックされると、カウントが増分され、待機スレッドは追加されません。 所有スレッドは pthread_mutex_unlock() を同じ回数呼び出して、カウントをゼロに戻す必要があります。

mutex のタイプを以下に説明します。
PTHREAD_MUTEX_NORMAL
通常タイプの mutex はデッドロックを検出しません。つまり、スレッドがあらかじめこの mutex をアンロックすることなく再ロックしようとすると、デッドロックになります。mutex はスレッドに対してロック状態かアンロック状態のいずれかに なります。
PTHREAD_MUTEX_ERRORCHECK
エラー検査タイプの mutex はエラー検査を実行します。つまり、スレッドがこの mutex をアンロックしていないうちに再ロック しようとすると、エラーが戻されます。mutex はスレッドに対してロック状態かアンロック状態のいずれかに なります。スレッドが既にロックした mutex を再ロックしようとすると、エラーが戻されます。スレッドがアンロックされた mutex をアンロックしようとすると、エラーが戻されます。
PTHREAD_MUTEX_RECURSIVE
再帰タイプの mutex は、スレッドによる複数回のロックが可能です。つまり、スレッドがあらかじめこの mutex をアンロックすることなく再ロックしようとすると、その動作は実行されます。このタイプの mutex は、アンロック状態に戻るためには、ロックされた回数だけアンロックする必要があります。ロックされると、エラーが戻されます。
PTHREAD_MUTEX_DEFAULT
デフォルト・タイプの mutex は、デッドロックを検出しない 通常タイプの mutex にマップされます。つまり、スレッドがあらかじめこの mutex をアンロックすることなく再ロックしようとすると、デッドロックになります。mutex はスレッドに対してロック状態かアンロック状態のいずれかに なります。通常タイプの mutex はデフォルト・タイプの mutex です。

戻り値

正常に実行された場合、pthread_mutex_lock() は 0 を戻します。

正常に実行されなかった場合、pthread_mutex_lock() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
mutex の再帰的ロックの最大数を超えたため、mutex は 取得できませんでした。この errno は共用パスでのみ発生します。
EDEADLK
現行スレッドは既に mutex を所有しており、その mutex は __MUTEX_NONRECURSIVE の kind 属性をとります。
EINVAL
mutex によって指定された値は無効です。

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

使用上の注意

_OPEN_SYS_MUTEX_EXT フィーチャー・スイッチが設定されている場合、スレッドが 終了 (正常終了であっても、異常終了であっても) したときに、すべての 共用 (拡張) mutex ロックが解放されます。 スレッドが通常に終了した場合 (すなわち、pthread_exit() また は pthread_cancel())、mutex ロックの最初の待機者が再開されます。 スレッドが異常終了した場合、この mutex ロックの mutex 待機者のプロセスは終 了します。

CELEBP38
⁄* CELEBP38 *⁄                                   
#ifndef _OPEN_THREADS                                                           
#define _OPEN_THREADS                                                           
#endif                                                                          
                                                                                
#include <pthread.h>                                                            
#include <stdio.h>                                                              
                                                                                
main() {                                                                        
  pthread_mutex_t mut;                                                          
                                                                                
  if (pthread_mutex_init(&mut, NULL) != 0) {                                    
    perror("mutex_lock");                                                       
    exit(1);                                                                    
  }                                                                             
                                                                                
  if (pthread_mutex_lock(&mut) != 0) {                                          
    perror("mutex_lock");                                                       
    exit(2);                                                                    
  }                                                                             
                                                                                
  puts("the mutex has been locked");                                            
  exit(0);                                                                      
}                                                                               

関連情報