Quick Flow
text
lock mutex
while condition is false:
wait(condition_variable, mutex) # atomically unlocks and sleeps
use protected state
unlock mutexCondition variable는 상태 자체를 저장하는 lock이 아닙니다. 공유 조건은 mutex로 보호하고, wake 뒤에는 조건을 반드시 다시 검사합니다.
대기 계약
Wait 연산은 lock을 놓고 thread를 잠들게 하는 과정을 원자적으로 연결해 signal을 놓치는 구간을 막습니다. 깨어날 때는 lock을 다시 얻은 뒤 반환합니다.
Wake가 왔다는 사실은 조건이 여전히 참이라는 보장이 아닙니다. 다른 consumer가 먼저 값을 가져갈 수 있고, spurious wakeup이 허용되는 API도 있습니다. 그래서 if가 아니라 while predicate를 사용합니다.
생산자·소비자
text
producer: lock -> queue push -> unlock -> notify
consumer: lock -> while empty wait -> pop -> unlockNotify를 lock 안에서 할지 밖에서 할지는 API와 contention을 고려하지만, 상태 변경은 같은 mutex 계약 안에서 완료되어야 합니다.
자주 틀리는 점
- condition variable 단독으로 queue를 보호하지 않습니다.
- notify 횟수와 처리할 item 수가 항상 일대일로 저장된다고 생각하지 않습니다.
- 종료 시 waiting thread가 영원히 남지 않도록 shutdown predicate와 broadcast를 설계합니다.
- timeout 뒤에도 predicate가 참인지 다시 확인합니다.
참고 링크
1 sources