pthread_mutex_unlock() - mutex オブジェクトのアンロック

標準

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

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

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

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

int pthread_mutex_unlock(pthread_mutex_t *mutex);

機能説明

mutex オブジェクトを解放します。1 つ以上のスレッドが mutex のロックを待機している場合は、pthread_mutex_unlock() により、それらのスレッドの 1 つが、取得した mutex オブジェクトを使用して pthread_mutex_lock() から 戻されます。スレッドが mutex を待機していない場合には、mutex は現行所有者をアンロックしません。

mutex が再帰的属性を持つ場合、そのロックの使用法は異なることがあります。この種の mutex が 同じスレッドによって複数回ロックされると、アンロックのカウントが 減少し、ロック状態で継続して実行される待機スレッドは追加されません。カウントがゼロに戻ると、mutex は解放され、待機中のスレッドがある場合は追加されます。

戻り値

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

正常に実行されなかった場合、pthread_mutex_unlock() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EINVAL
mutex によって指定された値は無効です。
EPERM
現行スレッドは mutex を所有していません。

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

CELEBP41
⁄* CELEBP41 *⁄                                   
#define _OPEN_THREADS                                                           
#include <pthread.h>                                                            
#include <stdio.h>                                                              
#include <errno.h>                                                              
                                                                                
pthread_mutex_t mutex;                                                          
                                                                                
void *thread(void *arg) {                                                       
  if (pthread_mutex_lock(&mutex) != 0) {                                        
    perror("pthread_mutex_lock() error");                                       
    exit(1);                                                                    
  }                                                                             
                                                                                
  puts("thread was granted the mutex");                                         
                                                                                
  if (pthread_mutex_unlock(&mutex) != 0) {                                      
    perror("pthread_mutex_unlock() error");                                     
    exit(2);                                                                    
  }                                                                             
}                                                                               
                                                                                
main() {                                                                        
  pthread_t thid;                                                               
                                                                                
  if (pthread_mutex_init(&mutex, NULL) != 0) {                                  
    perror("pthread_mutex_init() error");                                       
    exit(3);                                                                    
  }                                                                             
                                                                                
  if (pthread_create(&thid, NULL, thread, NULL) != 0) {                         
    perror("pthread_create() error");                                           
    exit(4);                                                                    
  }                                                                             
  if (pthread_mutex_lock(&mutex) != 0) {                                        
    perror("pthread_mutex_lock() error");                                       
    exit(5);                                                                    
  }                                                                             
                                                                                
  puts("IPT was granted the mutex");                                            
                                                                                
  if (pthread_mutex_unlock(&mutex) != 0) {                                      
    perror("pthread_mutex_unlock() error");                                     
    exit(6);                                                                    
  }                                                                             
                                                                                
  if (pthread_join(thid, NULL) != 0) {                                          
    perror("pthread_mutex_lock() error");                                       
    exit(7);                                                                    
  }                                                                             
}                                                                               
出力:
IPT was granted the mutex
thread was granted the mutex

関連情報