안녕하세요. 앤디라이언입니다.
오늘은 mutex에 대해 알아볼까 합니다.
mutex
mutex는 여러 개의 쓰레드가 공유하는 자원에 대한 점유권을 가지게 하는 것으로
많이 비유하는 표현이 화장실 예가 있습니다.
화장실에 A라는 사람이 열쇠를 가지고 들어갔다고 생각해보세요. 그럼 그 다음 사람은 열쇠도 없고 문이 잠겨있기 때문에 A라는 사람이 나올 때까지 대기하고 있다가 A라는 사람이 볼 일을 보고 나오면 B라는 사람이 들어갈 수 있습니다.
mutex라는 영역이 바로 화장실에 비유됩니다.
여러 개의 쓰레드가 하나의 공유 자원을 가지고 작업을 하려고 할 때 점유한 A쓰레드가 있다면, A쓰레드가 작업을 완료하고 나올 때까지 나머지 쓰레드는 mutex영역에 들어갈 수 없습니다.
이와 비슷한 개념으로 크리티컬 섹션, 세마포어 등이 있습니다.
그럼 사용하기 위해 준비해야하는 사항은 무엇이 있는지 확인해 보겠습니다.
pthread_mutex_init
//pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr *attr);
/*param
*mutex : 주어진 인자의 mutex를 초기화한다.
*attr : mutex특성을 변경할 수 있다. 기본 특성을 사용하는 경우 NULL을 사용한다.
** 특성의 종류
(1) fast
(2) recursive
(3) error checking
기본적으로 fast가 주로 사용된다.
*/
pthread_mutex_init은 mutex 객체를 초기화하는데 사용합니다.
pthread_mutex_destroy
//pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex);
mutex_init인 경우 mutex_destroy는 mutex 객체를 소멸하기 위해 사용됩니다.
mutex를 제거하기 위해서는 unlock상태여야만 합니다.
pthread_mutex_lock
//pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);
A라는 쓰레드가 크리티컬섹션 영역에 진입을 나타냅니다.
A라는 쓰레드가 사용 중이기 때문에 다른 쓰레드가 진입을 시도할 경우
블럭상태로 진입하고, A쓰레드가 unlock되면 블럭상태가 해제되어 진입을 시도할 수 있습니다.
pthread_mutex_unlock
//pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);
A쓰레드가 크리티컬섹션 영역에서 작업을 마치고 나온 경우 unlock상태가 됩니다.
그 후 다른 쓰레드가 진입하여 lock상태로 변경하고 작업을 진행하게 됩니다.
지금까지 배운 내용을 한번에 정리를 해볼까요?
pthread_mutex_t mutex;
int global_count = 0;
void *thread_proc(void *data)
{
int i;
char *thread_name = (char*)data;
phtread_mutex_lock(&mutex);
//critical section
global_count = 0;
for(i = 0; i < 3 ; i++)
{
printf("%s count : %d\n", thread_name, global_count);
global_count++;
sleep(1);
}
pthread_mutex_unlock(&mutex);
}
int main(void)
{
pthread_t thread[2];
int status;
//mutex init
pthread_mutex_init(&mutex, NULL);
pthread_create(&thread[0], NULL, thread_proc, (void*)"TH1");
pthread_create(&thread[1], NULL, thread_proc, (void*)"TH2");
pthread_join(thread[0], (void*)status);
pthread_join(thread[1], (void*)status);
pthread_mutex_destroy(&mutex);
return 0;
}
메인 함수를 보면 pthread_mutex_init으로 크리티컬 섹션을 생성하게 됩니다.
생성된 크리티컬 섹션에 thread_proc라는 쓰레드 함수에서
critical section에 작업을 완료하면 다른 쓰레드가 진입하여
공유자원의 카운트를 증가시키는 예시입니다.
'개발 이야기' 카테고리의 다른 글
메세지 큐 (Message Queue) (0) | 2020.05.08 |
---|---|
IPC 종류와 특징 (0) | 2020.05.08 |
POSIX C pthread (0) | 2020.05.07 |
POSIX C (0) | 2020.05.07 |
[파이썬 완전정복] 변수의 활용 연습하기 (0) | 2020.05.04 |