뮤텍스(mutex)

hyenam·2021년 10월 15일

Philosophers

목록 보기
5/7

mutex 는 여러개의 쓰레드가 공유하는 데이타를 보호하기 위해서 사용되는 도구로써,

보호하고자 하는 데이타를 다루는 코드영역을 단지 '한번에 하나의 쓰레드만' 실행가능 하도록 하는 방법으로 공유되는 데이타를 보호한다.

이러한 코드영역(하나의 쓰레드만 점유가능한)을 critical section 이라고 하며, mutex 관련 API 를 이용해서 관리할 수 있다.

mutex를 초기화하는데에는 두 가지 방법이 존재합니다.

  1. 정적으로 할당된 뮤텍스를 초기화하려면 PTHREAD_MUTEX_INITIALIZER 상수를 이용해서 초기화합니다.
    이런 형식으로 사용합니다. : pthread_mutex_t lock = PTHREAD_MUTX_INITIALIZER;
  2. 동적으로 초기화하려면 pthread_mutex_init 함수를 사용하면 됩니다. mutex를 사용하기 전에 초기화를 시작해야합니다.

pthread_mutex_init

mutex 객체를 초기화 시키기 위해서 사용

프로토타입
int pthread_mutex_init(pthread_mutex_t mutex, const pthread_mutex_attr attr);

  • 첫번째 인자로 주어지는 mutex 객체 mutex를 초기화
  • 두번째 인자인 attr 를 이용해서 mutex 특성을 변경할수 있다. 기본 mutex 특성을 이용하기 원한다면 NULL 을 사용하면 된다

mutex 특성(종류)에는 "fast", "recurisev", "error checking" 의 종류가 있으며, 디폴트으로 "fast" 가 사용.

  • pthread_mutex_t 구조체
  • pthread_mutex_lock() : critical section 시작
  • pthread_mutex_unlock() : critical section 종료
  • pthread_mutex_destroy : mutex를 파괴

pthread_mutex_lock, pthread_mutex_unlock : 이 두 함수는 mutex를 이용하여 임계 구역을 진입할때 그 코드 구역을 잠그고 다시 임계 구역이 끝날때 다시 풀어 다음 스레드가 진입할 수 있도록 합니다.

pthread_mutex_lock() 과 pthread_mutex_unlock() 사이의 critical section 은 한번에 하나의 쓰레드만 수행할수 있고, 먼저 이 critical section에 진입한 쓰레드가 종료할때까지 다른 쓰레드는 대기상태에 있다가, 앞선 쓰레드가 critical section 을 끝내고 빠져나오면 진입

pthread_mutex_lock

만약 뮤텍스 타입이 PTHREAD_MUTEX_NORMAL이라면, 데드락 감지를 지원하지 않는다. 따라서 뮤텍스를 다시 잠그려 한다면 뮤텍스는 데드락이 발생한다.

만약 뮤텍스 타입이 PTHREAD_MUTEX_ERRORCHECK이라면, 데드락 감지를 지원한다 . 따라서 뮤텍스를 다시 잠그려 한다면 뮤텍스는 오류 값을 반환한다.

만약 뮤텍스 타입이 PTHREAD_MUTEX_RECURSIVE이라면, 뮤텍스를 소유한 스레드의 반복적인 잠금을 허용한다.

만약 뮤텍스 타입이 PTHREAD_MUTEX_DEFAULT로 설정된다면, PTHREAD_MUTEX_RECURSIVE과 같게 동작한다.

성공적으로 수행되면 0을 반환하고, 그렇지 않다면 오류 값을 반환한다.


학습에 참고한 사이트

profile
공부한 걸 정리하고 있습니다.

0개의 댓글