생산자와 소비자는 빈 칸, 데이터, 버퍼 접근을 따로 맞춘다
empty는 넣을 공간, items는 꺼낼 데이터, mutex는 버퍼 배열 접근을 지킨다.
producer
wait empty
빈 슬롯 확보
buffer
mutex
한 번에 한 스레드
consumer
wait item
데이터 도착 대기
signal
상태 갱신
empty/items 반대 증가
세마포어
의미
잘못 쓰면
empty
남은 슬롯 수
생산자가 덮어씀
items
꺼낼 데이터 수
소비자가 빈 버퍼 읽음
mutex
버퍼 구조 보호
head/tail 경쟁
순서
wait 후 lock
deadlock 위험 줄임