티스토리 뷰
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 |
- Total
- Today
- Yesterday
- DRF 회원관리
- 스택 파이썬
- c++덱
- 11053 백준
- 시뮬레이션 c
- 백준 10866
- 기사작성 대외활동
- 4963 섬의개수
- 딥러닝입문
- 13886
- 모듈 사용법
- 영화 리뷰 긍정 부정 분류
- 백트래킹(1)
- 핀테크 트렌드
- 효율적인방법찾기
- 백준 4963
- 소프트웨어공학설계
- 백준 15650 파이썬
- 파이썬 알아두면 유용
- CREATE ASSERTION
- 코딩월드뉴스
- 백준 11053 파이썬
- 기본 텍스트 분류
- 온라인프로필 만들기
- stack 컨테이너
- mm1queue
- 10866 백준
- LAMBDA
- CSMA/CD란?
- 백준 숫자놀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |