1. 개요
락 이외에도 병행 프로그램을 제작할 수 있는 다른 기법들이 존재한다.
2. 컨디션 변수의 개념과 관련 루틴
스레드 실행시, 특정 조건이 만족될 때까지의 대기를 위해 컨디션 변수(conditional variable)
라고 불리는 개념을 사용할 수 있다.
컨디션 변수는 일종의 큐
자료 구조이다.
컨디션 변수는 스레드 실행에서 어떤 상태가 원하는 것과 다를 때 조건
이 만족되기를 대기하는 큐이다.
컨디션 변수에는 wait()와 signal()이라는 두 개의 연산이 있다.
wait()
은 스레드가 스스로를 잠재우기 위해서 호출하는 것이고 signal()
은 조건이 만족되기를 대기하며 잠자고 있던 스레드를 깨울 때 호출한다.
wait()은 mutex를 해제하고 호출한 스레드를 재운다.
다른 스레드가 시그널을 보내어 대기중인 스레드가 슬립(sleep) 상태에서 깨어나면, wait()에서 리턴하기 전에 반드시 락을 재획득
해야 한다.
시그널을 받아서 대기상태에서 깨어났더라도 락 획득에 실패하면 다시 sleep 상태로 들어간다.
대기 전과 후에 각각 락의 반납과 획득을 강제
한다.
3. 생산자/소비자(유한 버퍼) 문제
Dijkstra가 처음 제시한 생산자/소비자
문제는 유한 버퍼(bounded buffer)
문제로도 알려져 있다.
공유 변수
에서 경쟁 조건
이 발생한다.
두 개
의 컨디션 변수를 사용하면 된다.