이렇게만 놓고 보면 별로 문제될 것이 없어 보입니다. 그런데 항상 스레드 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뿐만 아니라 그 이상의 값도 가능해야 하는데, 이때 사용하는 것이 바로 세마포어입니다.