標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.4a |
両方 | POSIX(ON) |
#define _OPEN_THREADS
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
#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 を戻します。
Single UNIX Specification、バージョン 3 の特殊な動作: 正常に実行されなかった場合、pthread_mutex_unlock() はエラーを示すエラー番号を戻します。
⁄* 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