여러 Thread가 한 번에 mutable 변수에 접근한다면?
-> 데이터의 일관성을 보장할 수 없음 🤢
이 문제를 어떻게 해결할 수 있을까
마지막 방법에 대해 자세히 알아보자
✔️ 동기화: Thread가 자원에 접근할 때 처리권한을 주거나 순서를 조정하는 기법
동기화 기법들에 대해 알아보자
모드에 따라 다음과 같이 나누어진다.
// Thread #1이 실행
void* do_loop(void *data)
{
int i;
for (i = 0; i < 10; i++)
{
pthread_mutex_lock(&mutex); // 잠금을 생성한다.
printf("loop1 : %d\n", ncount);
ncount ++;
if(i == 10) return;
pthread_mutex_unlock(&mutex); // 잠금을 해제한다.
sleep(1);
}
}
// Thread #2가 실행
void* do_loop2(void *data)
{
int i;
// 잠금을 얻으려고 하지만 do_loop 에서 이미 잠금을
// 얻었음으로 잠금이 해제될때까지 기다린다.
for (i = 0; i < 10; i++)
{
pthread_mutex_lock(&mutex); // 잠금을 생성한다.
printf("loop2 : %d\n", ncount);
ncount ++;
pthread_mutex_unlock(&mutex); // 잠금을 해제한다.
sleep(2);
}
}
👆 일관성 있는 count 출력 확인
ref. https://www.joinc.co.kr/w/Site/Thread/Beginning/Mutex
구분 | mutex | semaphore |
---|---|---|
메커니즘 | locking | signaling |
타입 | object | integer |
subtype | X | counting semaphore, binary semaphore |
소유 | O | X |
변화 | lock / unlock | wait() / signal() |
👉 데드락 발생
해당 thread는 waiting list에 들어왔는데 다른 thread가 unlock할 수 없음
👉 No
locking mechanism != signaling mechanism
근데 동작하는건 같아 보임