mutex 는 여러개의 쓰레드가 공유하는 데이타를 보호하기 위해서 사용되는 도구로써,
보호하고자 하는 데이타를 다루는 코드영역을 단지 '한번에 하나의 쓰레드만' 실행가능 하도록 하는 방법으로 공유되는 데이타를 보호한다.
이러한 코드영역(하나의 쓰레드만 점유가능한)을 critical section 이라고 하며, mutex 관련 API 를 이용해서 관리할 수 있다.
mutex를 초기화하는데에는 두 가지 방법이 존재합니다.
mutex 객체를 초기화 시키기 위해서 사용
프로토타입
int pthread_mutex_init(pthread_mutex_t mutex, const pthread_mutex_attr attr);
mutex 특성(종류)에는 "fast", "recurisev", "error checking" 의 종류가 있으며, 디폴트으로 "fast" 가 사용.
pthread_mutex_lock, pthread_mutex_unlock : 이 두 함수는 mutex를 이용하여 임계 구역을 진입할때 그 코드 구역을 잠그고 다시 임계 구역이 끝날때 다시 풀어 다음 스레드가 진입할 수 있도록 합니다.
pthread_mutex_lock() 과 pthread_mutex_unlock() 사이의 critical section 은 한번에 하나의 쓰레드만 수행할수 있고, 먼저 이 critical section에 진입한 쓰레드가 종료할때까지 다른 쓰레드는 대기상태에 있다가, 앞선 쓰레드가 critical section 을 끝내고 빠져나오면 진입
만약 뮤텍스 타입이 PTHREAD_MUTEX_NORMAL이라면, 데드락 감지를 지원하지 않는다. 따라서 뮤텍스를 다시 잠그려 한다면 뮤텍스는 데드락이 발생한다.
만약 뮤텍스 타입이 PTHREAD_MUTEX_ERRORCHECK이라면, 데드락 감지를 지원한다 . 따라서 뮤텍스를 다시 잠그려 한다면 뮤텍스는 오류 값을 반환한다.
만약 뮤텍스 타입이 PTHREAD_MUTEX_RECURSIVE이라면, 뮤텍스를 소유한 스레드의 반복적인 잠금을 허용한다.
만약 뮤텍스 타입이 PTHREAD_MUTEX_DEFAULT로 설정된다면, PTHREAD_MUTEX_RECURSIVE과 같게 동작한다.
성공적으로 수행되면 0을 반환하고, 그렇지 않다면 오류 값을 반환한다.
학습에 참고한 사이트