얼핏 보면 잘 작동할 것 같습니다. 그러나 이 코드는 다음 문제가 있습니다. 매우 짧은 순간에 이 순서로 일을 할 수도 있기 때문입니다.
1. 스레드 1에서 이벤트를 기다립니다. 이벤트 상태 값은 0입니다. 큐는 비어 있습니다.
2. 스레드 2에서 이벤트에 신호를 줍니다. 이벤트 상태 값은 1이 됩니다. 큐에 항목이 1개 있습니다.
3. 스레드 1이 깨어납니다. 이벤트 상태 값은 0입니다. 큐에서 항목을 꺼냅니다. 큐에 항목이 0개가 됩니다.
4. 나머지
이를 표로 표현해 보겠습니다.
▼ 표 1-1 정상적인 처리일 때
처리 |
이벤트 상태 |
큐 항목 개수 |
스레드 1에서 이벤트 대기 후 큐에서 꺼낸다. |
0 |
0 |
스레드 2에서 큐에 넣고 이벤트에 신호를 준다. |
1 |
1 |
스레드 1에서 이벤트 대기 후 큐에서 꺼낸다. |
0 |
0 |
스레드 2에서 큐에 넣고 이벤트에 신호를 준다. |
1 |
1 |
스레드 1에서 이벤트 대기 후 큐에서 꺼낸다. |
0 |
0 |