pthread_mutex_lock, pthread_mutex_trylock 또는 pthread_mutex_unlock 서브루틴

용도

뮤텍스를 잠그고 잠금 해제합니다.

라이브러리

스레드 라이브러리libpthreads.a

구문

#include <pthread.h>
int pthread_mutex_lock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_trylock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_unlock ( mutex)
pthread_mutex_t *mutex;

설명

Mutex 매개변수가 참조하는 mutex 객체는 pthread_mutex_lock을 호출하여 잠급니다. mutex가 이미 잠겨 있으면 mutex가 사용 가능해질 때까지 호출 스레드가 차단됩니다. 이 연산은 호출 스레드를 소유자로 하는 잠긴 상태의 mutex 매개변수가 참조하는 mutex 객체와 함께 반환됩니다.

mutex 유형이 PTHREAD_MUTEX_NORMAL인 경우 교착 상태 발견이 제공되지 않습니다. 뮤텍스를 다시 잠그려고 하면 교착 상태가 발생합니다. 스레드가 잠기지 않은 뮤텍스 또는 잠금 해제된 뮤텍스를 잠금 해제하려고 시도하면 정의되지 않은 동작이 발생합니다.

mutex 유형이 PTHREAD_MUTEX_ERRORCHECK인 경우 오류 검사가 제공됩니다. 스레드가 이미 잠긴 뮤텍스를 다시 잠그려고 시도하면 오류가 반환됩니다. 스레드가 잠기지 않은 뮤텍스 또는 잠금 해제된 뮤텍스를 잠금 해제하려고 시도하면 오류가 반환됩니다.

mutex 유형이 PTHREAD_MUTEX_RECURSIVE인 경우 mutex는 잠금 계수의 개념을 유지합니다. 스레드가 처음으로 뮤텍스를 획득하면 잠금 계수가 1로 설정됩니다. 스레드가 이 뮤텍스를 다시 잠글 때마다 잠금 계수가 1씩 증가합니다. 스레드가 mutex를 잠금 해제할 때마다 잠금 계수가 1씩 감소합니다. 잠금 계수가 0에 도달하면 다른 스레드가 mutex를 획득할 수 있습니다. 스레드가 잠기지 않은 뮤텍스 또는 잠금 해제된 뮤텍스를 잠금 해제하려고 시도하면 오류가 반환됩니다.

mutex 유형이 PTHREAD_MUTEX_DEFAULT인 경우, mutex를 반복적으로 잠그려고 시도하면 정의되지 않은 작동이 발생합니다. 호출 스레드에 의해 잠기지 않은 경우 mutex를 잠금 해제하려고 시도하면 정의되지 않은 동작이 발생합니다. 잠겨 있지 않은 경우 mutex를 잠금 해제하려고 시도하면 정의되지 않은 동작이 발생합니다.

뮤텍스가 강건한 뮤텍스이고 강건한 뮤텍스를 소유한 스레드가 뮤텍스 잠금을 유지하는 동안 종료되는 경우, pthread_mutex_lock 서브루틴을 호출하면 EOWNERDEAD 오류 코드가 반환됩니다. 이 경우, 로버스트 뮤텍스는 스레드에 의해 잠기고 로버스트 뮤텍스의 보호 상태는 불일치로 표시됩니다. 강력한 뮤텍스의 보호 상태를 일관된 것으로 표시하기 위해 pthread_mutex_consistent 서브루틴을 호출할 수 있습니다.

뮤텍스가 강건 뮤텍스이고 강건 뮤텍스의 보호 상태가 일관되지 않은 경우, pthread_mutex_unlock 서브루틴을 호출하면 강건 뮤텍스의 상태를 영구적으로 사용할 수 없는 것으로 표시합니다. 이 경우, 강력한 뮤텍스에서 허용되는 유일한 연산은 pthread_mutex_destroy 서브루틴 호출입니다.

Pthread_mutex_trylock 함수는 mutex 파라미터가 참조하는 강력한 mutex 객체가 현재 잠겨 있는 경우(현재 스레드를 포함한 모든 스레드에 의해) 호출이 즉시 반환된다는 점을 제외하면 pthread_mutex_lock과 동일합니다.

Pthread_mutex_unlock 함수는 mutex가 참조하는 mutex 객체를 해제합니다. 뮤텍스가 해제되는 방식은 뮤텍스의 유형 속성에 따라 다릅니다. Pthread_mutex_unlock이 호출될 때 mutex 매개변수가 참조하는 뮤텍스 객체에 스레드가 차단되어 있어 뮤텍스가 사용 가능해지면 스케줄링 정책을 사용하여 어떤 스레드가 뮤텍스를 획득할지 결정합니다. (PTHREAD_MUTEX_RECURSIVE 뮤텍스의 경우, 뮤텍스는 계수가 0에 도달하고 호출 스레드가 더 이상 이 뮤텍스에 대한 잠금을 갖지 않을 때 사용 가능하게 됩니다.)

신호가 뮤텍스를 기다리는 스레드에 전달되면 신호 핸들러에서 리턴 시 스레드는 인터럽트되지 않은 것처럼 뮤텍스 대기를 재개합니다.

매개변수

항목 설명
mutex 잠글 mutex를 지정합니다.

리턴 값

성공하면 pthread_mutex_lockpthread_mutex_unlock 함수는 0을 반환합니다. 그렇지 않으면 오류를 표시하기 위해 오류 번호가 리턴됩니다.

Mutex 매개변수가 참조하는 뮤텍스 객체에 대한 잠금이 획득되면 pthread_mutex_trylock 함수는 0을 반환합니다. 그렇지 않으면 오류를 표시하기 위해 오류 번호가 리턴됩니다.

오류 코드

다음과 같은 경우 pthread_mutex_trylock 함수는 실패합니다:

항목 설명
EBUSY 뮤텍스가 이미 잠겨 있어 획득할 수 없습니다.

다음과 같은 경우 pthread_mutex_lock, pthread_mutex_trylockpthread_mutex_unlock 함수가 실패합니다:

항목 설명
EINVAL 뮤텍스 매개변수로 지정된 값은 초기화된 뮤텍스 객체를 참조하지 않습니다.

다음과 같은 경우 pthread_mutex_lock 함수는 실패합니다:

항목 설명
EDEADLK 현재 스레드가 이미 mutex를 소유하고 있으며 mutex 유형은 PTHREAD_MUTEX_ERRORCHECK입니다.

다음 오류 코드가 반환되면 pthread_mutex_unlock() 서브루틴은 실패합니다:

항목 설명
EPERM 현재 스레드가 뮤텍스를 소유하지 않으며, 뮤텍스의 유형이 PTHREAD_MUTEX_NORMAL이 아니거나 뮤텍스가 강력한 뮤텍스입니다.
다음 오류 코드가 반환되면 pthread_mutex_lock 서브루틴 또는 pthread_mutex_trylock 서브루틴이 실패합니다:
항목 설명
Enotrecoverable mutex의 보호 상태를 복구할 수 없습니다.
EOWNERDEAD 뮤텍스는 강력한 뮤텍스이며, 뮤텍스를 소유하는 스레드의 프로세스는 뮤텍스 잠금을 유지하는 동안 종료됩니다.

이러한 서브루틴은 EINTR 오류 코드를 반환하지 않습니다.