모니터와 조건 변수

모니터 lock과 condition

모니터는 공유 데이터와 그 데이터를 조작하는 절차를 하나의 동기화 단위로 묶습니다. 진입 시 lock으로 상호 배제를 보장하고, condition variable은 조건이 만족될 때까지 기다렸다가 다시 확인하게 합니다.

01

모니터에 진입한다

한 번에 하나의 스레드만 공유 데이터 조작 절차 안에 들어오게 합니다.

mutex
02

조건을 검사한다

버퍼가 비었는지, 가득 찼는지 같은 논리 조건을 lock을 잡은 상태에서 확인합니다.

predicate
03

조건 변수에서 기다린다

wait는 lock을 잠시 놓고 잠들었다가 깨어나면 다시 lock을 획득합니다.

wait
04

깨어난 뒤 재검사한다

signal은 조건이 참임을 영원히 보장하지 않으므로 while로 predicate를 다시 확인합니다.

recheck
Mutex
공유 데이터 접근의 상호 배제 데이터를 읽고 쓰는 모든 경로가 같은 lock 규칙을 따라야 합니다.
exclusion
Condition variable
상태가 바뀔 때까지 효율적으로 대기 조건을 만족하지 못한 스레드를 대기 큐에 넣고 signal/broadcast 때 깨웁니다.
waiting
Signal
기다리는 스레드에 상태 변화 가능성을 알림 깨어난 스레드는 lock을 다시 잡고 조건을 재확인합니다.
notify

while 사용 · 같은 lock · notify 위치 점검

while 사용 if로 한 번만 검사하면 허위 각성이나 경쟁 때문에 잘못 진행할 수 있습니다.
같은 lock 조건 검사와 상태 변경, signal은 같은 보호 경계 안에서 설계합니다.
notify 위치 상태를 바꾸지 않고 signal만 보내면 대기자가 다시 잠들 뿐입니다.