본문 바로가기
IT/programming

[C/C++] pthread_mutex_lock 설명

by 어느해겨울 2020. 3. 30.

pthread_mutex_lock

 - 뮤텍스 잠금을 얻거나 해제

1. 사용법

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);



2. 설명
* mutex
  - MUTual EXclusion(상호 배제)devide의 줄임말로 쓰레드간 공유하는 데이터 영역을 보호하기 위해서 사용
  - 데이터 영역의 보호는 critical section(임계 영역)을 만들고 임계 영역내에 단하나의 쓰레드만이 진입가능 
  - 보통 이 임계영역에는 보호하고자 하는 데이터에 대한 접근/수정 루틴이 들어감 
  - 데이터에 대한 접근/수정 루틴에 오직 하나의 쓰레드만 접근 가능하게 되므로 결국 데이터를 보호할 수 있음 

  - 뮤텍스는 unlock과 lock으로 2개의 가능한 행동만이 정의됨
  - lock은 임계영역으로 진입을 위한 요청, unlock은 임계영역에서 나오면서 다른 쓰레드에게 임계영역을 반환
  - 만약 쓰레드가 임계영역이 진입하기 위해서 lock을 시도 했는데, 다른 쓰레드가 이미 임계영역에 진입했다면
    해당 쓰레드가 unlock을 해서 임계영역을 빠져나오기 전까지 기다림 

  - mutex는 fast와 recursive의 2가지 종류가 지원되고 기본적으로 fast 상태로 시작
  - lock을 얻은 쓰레드가 다시 lock을 얻을 수 있도록 할 것인지를 결정하기 위해서 사용 
  - mutex 종류에 대한 자세한 내용은 pthread_mutexattr_init(3)을 참고

* pthread_mutex_t
  - 뮤텍스의 특징을 결정하기 위해서 사용
 PTHREAD_MUTEX_INITIALIZER(fast mutex)
 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP(recursive mutex)
 PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP(mutex 에러 체크용)
    3가지 상수중 하나 사용

* pthread_mutex_lock
  - int pthread_mutex_lock(pthread_mutex_t *mutex);
  - 임계영역에 진입하기 위한 뮤텍스 잠금을 요청
  - 만약 뮤텍스의 최근 상태가 unlocked라면 쓰레드는 잠금을 얻고 임계영역에 진입하게 되고 리턴한다
  - 다른 쓰레드가 뮤텍스 잠금을 얻은 상태라면 잠금을 얻을 수 있을 때까지 기다리게 된다. 

* pthread_mutex_trylock
  - int pthread_mutex_trylock(pthread_mutex_t * mutex );
  - pthread_mutex_lock 과 동일하게 동작하지만 뮤텍스가 다른 쓰레드에 의해 이미 unlocked 상태에 있는 경우 
    호출한 쓰레드를 블록시키지 않음(fast 뮤텍스의 경우에는 동일한 쓰레드인 경우도 해당)

* pthread_mutex_unlock
  - int pthread_mutex_unlock(pthread_mutex_t *mutex);
  - 뮤텍스 잠금을 되돌려줌
  - 만약 fast 뮤텍스라면 pthread_mutex_unlock()는 언제나 unlocked 상태를 되돌려주고 recursive 뮤텍스라면
    잠겨있는 뮤텍스의 수를 감소시키고 이 수가 0이 된다면 뮤텍스잠금을 되돌려줌

* pthread_mutex_destory()
  - int pthread_mutex_destroy(pthread_mutex_t *mutex);
  - 뮤텍스 객체를 삭제하고 자원을 되돌려줌
  - 더이상 사용하지 않는 뮤텍스는 반드시 이 함수를 이용해서 삭제해야함
  - 리눅스에서 쓰레드는 뮤텍스 객체와 별개로 되어 있어서 쓰레드가 종료되었다고 하더라도 뮤텍스 객체는 
    여전히 남아 있음 그러므로 이 함수를 호출해야지만 뮤텍스 객체가 삭제됨

3. 반환값 & 에러
  - 성공 0 반환
  - 실패 0이 아닌 수, 적당한 errno를 설정
    -- pthread_mutex_init()
       언제나 0을 리턴
    -- pthread_mutex_lock()
        EINVAL  : 뮤텍스가 잘못 초기화됨
        EDEADLK : 이미 잠금을 얻은 쓰레드가 다시 잠금을 요청할 때(errorchecking 뮤텍스일 경우 사용가능) 
    -- pthread_mutex_trylock()
        EBUSY  : 뮤텍스가 잠겨 있어서 잠금을 얻을 수 없음
        EINVAL  : 뮤텍스가 잘못 초기화 됨

 

 

댓글