스레드 t1은 임계 영역 a, b 순서로 잠금하고 잠금 해제를 합니다. 스레드 t2는 임계 영역 b, a 순서로 잠금과 잠금 해제를 합니다. 이를 무한 반복합니다. 무한 반복을 하는 이유는 그림 1-27과 같은 상황을 정확하게 재현하지 못할 가능성이 있기 때문입니다.
이 프로그램을 실행하면 두 스레드는 잠금-잠금 해제를 무한 반복하다가 어느 순간에 교착 상태를 일으킵니다. 콘솔 창에 계속 출력되다가 어느 순간부터 잠잠해지는 것으로 교착 상태를 일으킨 것을 알 수 있습니다.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
t1 done.
(멈춤)
교착 상태를 일으킨 상태에서 디버그 중지(debug break) 버튼을 눌러 봅시다. Visual Studio에서는 Debug/Break All 메뉴 혹은 툴바에서 Break All이라고 표시되는 아이콘입니다.
▲ 그림 1-28 디버그 중지 버튼