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 : 뮤텍스가 잘못 초기화 됨
'IT > programming' 카테고리의 다른 글
[C/C++] C언어 main 함수 전/후에 함수를 실행 하는 방법 (0) | 2021.12.21 |
---|---|
[C/C++] pthread condition 설명 (0) | 2020.03.30 |
[C/C++] C언어 출력에 색깔 입히기 예제 (1) | 2015.12.16 |
[C/C++] 음수에서 양수로 변환 예제 (0) | 2014.12.19 |
[C/C++] C99 구조체 초기화 하는 방법 (0) | 2014.12.19 |
댓글