23년7월 5일
크리티컬 섹션을 만들어 동기화하는 방법으로는 lock키워드와 monitor 키워드가 있다.
둘의 기능은 똑같지만 monitor키워드는 좀 더 섬세한 동기화가 가능하다. 그 이유는 monitor.pulse()와 monitor.wait()메서드가 있기 때문이다.
예를 들어, thread.sleep() 메서드로 WaitSleepJoin 상태에 들어간 스레드는 경과시간이 지나거나 interrupt예외를 받아야 깨어난다. 하지만 wait()메서드로 WaitSleepJoin상태에 들어가면 pulse()로 바로 깨울 수 있다. 이 때문에 멀티스레드 앱에선 성능 향상을 위해 pulse() 와 Wait() 메서드를 사용한다.
lock(thisLock)
{
while (Count>0||lockedCount == true)
Monitor.Wait(thisLock);
lockedCount = true;
count--;
lockedCount = false;
Monitor.Pulse(thisLock);
}
위의 코드를 예시로 들어보자. Count>0 이거나 lockedCount == true이면 해당 스레드는 잠시 WaitSleepJoin 상태로 들어가 Waiting Que에 대기한다. lock을 놓고 기다리고 있다가 다른 스레드의 Monitor.Pulse(thisLock)에 의해 호출되면 다시 메서드를 실행한다. 이번에는 while문을 통과하여 해당 메서드를 수행한 후 Monitor.Pulse(thisLock)을 호출하여 Waiting Que에 대기하고 있는 스레드를 호출한다.
sleep 메소드를 써도 thread.Interrupt(); 로 바로 깨울 순 없나요?