티스토리 뷰

what?

스레드의 동기화 문제를 해결하기 위해 사용하는 커널이 제공하는 일종의 플래그.

멀티프로세스 프로그램에서의 세마포어를 사용해도 무방하지만 프로그램의 구현이 뮤택스가 더 쉬움

바이너리 세마포어와 유사하게 적용


how?

크리티컬 영역 기준으로 look -> unlook이 진행된다.

<<뮤텍스의 사용방법>>

- 크리티컬 영역에 들어가기 "직전"

: 뮤텍스를 잠금 시켜 다른 스레드가 사용하지 못하게 하여 자신만 사용

- 크리티컬 영역에 나온 "직후"

: 뮤텍스를 해제하여 다른 스레드가 사용할 수 있게 함.

 

<<뮤택스 사용절차>>

pthread_mutex_t mutex; //  1. 뮤텍스 생성 (선언)

// 2.뮤텍스 초기화 작업

pthread_mutex_lock(mutex); // 3. 뮤텍스 잠금

// 4. 공유데이터(크리티컬 영역) 엑세스

pthread_mutex_unlock(mutex);//4. 뮤텍스 잠금해제

 

<<뮤텍스 선언 및 초기화>>

=>기본속성만을 갖는 뮤텍스는 매크로 사용/ 뮤텍스에 속성을 지정하고 싶다면 attr인자 활용

1. 매크로를 활용 : pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

2. 함수를 활용 : pthread_mutex_init(pthread_t *mutex, pthread_mutexattr_t *attr);

 

attr인자에 속성 지정 : pthread_mutexattr_settype()을 사용

pthread_mutext_t mutex;

pthread_mutexattr_T attr;

pthread_mutexatttr_settype(&attr, type); // 뮤텍스 타입을 type에 지정

pthread_mutex_init(&mutex, &attr); // 속성을 뮤텍스에 적용하여 뮤텍스 초기화

=> type은 뮤텍스의 타입을 지정하기 위한 상수

 

<<뮤텍스 타입의 종류 네가지 -> 기본/타임드/ 리퀄시브/에러체킹>>

  • PTHREAD_MUTEX_TIMED_NP // timed 타입
  • PTHREAD_MUTEX_RECURSIVE_NP//recursive타입
  • PTHREAD_MUTEX_ERRORCHECK_NP//error checking 타입
  • 기본타입

<<뮤텍스의 삭제>>

 

뮤텍스를 삭제할 때 잠긴상태에서 삭제하면 에러가 발생하기때문에 무조건 뮤택스를 unlock하고 destory를 실행.

 

pthread_mutex_unlock(&mutex);
// 1. 뮤텍스 destory이전에 무조건 잠금 해제
pthread_mutex_destory(&mutex);
// 2. 뮤텍스 삭제

=> 만약 뮤텍스를 해제하지 않고 destory(&mutex)를 한다면 EBUSY 발생.

 

<<뮤텍스와 데드락>>

각 스레다가 뮤텍스를 잠그고 있을 때 서로 뮤텍스 해제를 기다리는 상태에서 영원히 블록처리가 발생하며 이것을 데드락이라고 함.

따라서, 서로 연관있는 작업에서 다수의 뮤텍스를 사용할 때는 데드락이 발생하지 않도록 주의

=> 잠금을 위한 순서를 정해놓는 방법

 

<<뮤텍스의 성능>>

크리티컬 영역의 크기가 가능한 최소화 되어야 성능 향상에 도움

뮤텍스를 얻은 상태에서 (잠금상태에서) 작업량이 크면 다른 스레드는 블록되어 대기중일 가능성이 커지기 때문


why?

전역변수 즉 크리티컬 영역에서의 공유데이터가 많은 스레드를 통해 같이 사용하게 된다면 동기화 문제로 인해 잘못처리되는 결과가 발생할 수 있음.

=> 다음시간에 race.c 예제를 통해서 알아보자.

 

동기화 문제를 해결하기 위한 해결방안 중 flag를 사용할 수 있지만 플래그 값을 정의한 후 공유데이터를 읽기 직전에도 역시 동기화 문제가 발생할 수 있기에 완전히 해결할 수는 없음.

 

따라서 커널이 제공하는 일종의 플래그인 뮤텍스를 사용함.

 

 


동기화 문제가 있는 예제와 이를 해결하기 위해 pthread mutex_t mutext를 통해 생성한 mutex를 활용해 lock, unlock()하는 예제 두개를 다음시간에 살펴보자!

'네트워크프로그래밍' 카테고리의 다른 글

스레드의 조건변수  (0) 2021.06.04
스레드[경쟁실행, 동기화문제] 예제  (0) 2021.06.02
스레드 취소요청  (0) 2021.06.02
THREAD 프로그래밍  (0) 2021.05.31
세마포어(2)  (0) 2021.05.31