더북(TheBook)

이렇게만 놓고 보면 별로 문제될 것이 없어 보입니다. 그런데 항상 스레드 1·2가 이렇게 번갈아 일을 한다는 보장은 없습니다. 스레드 1이 조금 더 많은 처리 시간을 쓰거나 스레드 2가 좀 더 빨리 일이 끝나 버릴 수도 있기 때문입니다. 스레드 2가 일을 좀 더 빨리 마칠 경우 이렇게 될 수도 있습니다.

▼ 표 1-2 비정상적인 처리일 때

처리

이벤트 상태

큐 항목 개수

스레드 1에서 이벤트 대기 후 큐에서 꺼낸다.

0

0

스레드 2에서 큐에 넣고 이벤트에 신호를 준다.

1

1

스레드 2에서 큐에 넣고 이벤트에 신호를 준다.

1

2

스레드 1에서 이벤트 대기 후 큐에서 꺼낸다.

0

1

 

표 1-2에서 볼 수 있듯이 스레드 2가 두 번 일을 해 버리면, 결국 최종 상태에서 큐는 항목이 있음에도 이벤트 상태 값이 0이 됩니다. 그러면 스레드 1은 큐에 뭔가 할 일이 있어도 계속 기다리는 상황이 되어 버립니다(표 1-2 5행 참고). 한마디로 버그입니다.

이 문제를 해결하려면 어떻게 해야 할까요? 상태 값이 0과 1뿐만 아니라 그 이상의 값도 가능해야 하는데, 이때 사용하는 것이 바로 세마포어입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.