Lock키워드와 Monitor클래스

서병수·2023년 7월 5일
0

쓰레드와 테스크

목록 보기
1/5

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에 대기하고 있는 스레드를 호출한다.

profile
안녕하십니까 인사올립니다

2개의 댓글

comment-user-thumbnail
2023년 7월 6일

sleep 메소드를 써도 thread.Interrupt(); 로 바로 깨울 순 없나요?

1개의 답글