공유메모리,정적 객체를 사용하는 경우 쓰레드에 안전하지 않다.
예) strtok.
이럴 경우, 재진입성 ( reentrancy ) 을 보장하도록 형태를 취하여 쓰레드 안전을 취하는 경우 독립적인 처리가 가능하다.
쓰레드에 안전하지 않은 함수에, 뮤텍스를 통해 쓰레드 안전을 유지하려는 경우
예를 들어 전역으로 선언된 큐에 여려 개의 쓰레드가 큐에 아이템을 넣거나 빼는 작업을 하는 경우가 있다는 가정일때
큐에 접근하는 쓰레드들이 큐를 변경시키는 모든 행위는 배타적으로 진행되어야 함으로 뮤텍스로 보호되어야 한다.
하지만 공유 자원을 보호하는 데 있어서 뮤텍스를 적용하는 것이 능사만은 아니다.
예를 들자면 TCP/Ip 네트워크 통신을 하는 코드에 멀티 쓰레드를 도입 하고 Send 함수에 뮤텍스로 보호했다고 가정 한다면
Send 하다가 블록킹 되면 즉시 뮤텍스를 풀어주지 못하기 때문에 데드락이 발생된다.
넌 블럭킹 모드로 변경해도 뮤텍스 관련 로직이 매우 복잡해지므로 데드락 버그 발생 가능성이 높아진다.
따라서 응답이 바로 오지 않을 가능성이 있는 외부 통신에는 뮤텍스를 직접 걸지 않는 것이 일반적이다.
그래서 이런 입출력에 멀티쓰레드를 도입할때는 i/o만 도맡아서 처리하는 작업 큐를 만들어두고 큐를 검사하면서 실제로 출력을 하는 쓰레드는 1개나 혹은 몇개의 그룹으로 직렬화시키고 나머지 쓰레드들은 입출력 작업을 큐에 등록만 해두는 분리된 I/O 형식을 사용하는 경우가 많다
쓰레드 상태에서 조건변수와 뮤텍스 함수 사용 예 )
쓰레드 A 쓰레드 B
pthread_mutex_lock
아이템을 준비한다. 큐가 비었는가 ? YES
pthread_mutex_lock pthread_cond_wait
큐에 아이템 삽입 ( push ) pthread_cond_signal 신호에 의한 깨어남.
pthread_mutex_unlock pop item
pthread_cond_signal pthread_mutex_unlock
초기화 방법은 조건변수나 뮤텍스 비슷하다.
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //정적 초기화
pthread_mutex_init(&mutex,NULL) // 기본값으로 초기화
mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); //동적할당
pthread_mutex_init(&mutex,NULL) // 기본값으로 초기화
'C 프로젝트 > 리눅스 프로그래밍' 카테고리의 다른 글
epoll (0) | 2014.05.22 |
---|---|
Socket Non-blocking (0) | 2014.05.22 |
C 라이브러리 - 패턴 매칭 사용 예제 (0) | 2014.04.04 |
C 라이브러리 - 패턴 매칭 (0) | 2014.04.04 |
조건 변수 , 뮤텍스 (0) | 2013.12.26 |