이벤트 + 락 = Eventable Lock 클래스

스레드를 동기화할 때는 다음 형식을 매우 흔히 볼 수 있다.

스레드1

  1. 락을 건다.
  2. 큐에 넣는다.
  3. 락을 풀고 신호를 보낸다.

스레드2

  1. 신호를 기다린다.
  2. 락을 건다.
  3. 큐에서 꺼낸다.
  4. 락을 푼다.

C++11로는 흔히 mutex, condition_variablelock_guard, unique_lock과 함께 사용해 처리하면 되며 보통 다음과 같다.

이때 동기화에 사용하는 mutex와 condition_variable은 두 스레드에서 공유해야 한다. 워낙 흔하게 쓰는 형식인데다 여러 객체를 만들어 공유하는 것은 조금 귀찮으므로 신호를 보낼 수 있는 락 객체를 하나 만들면 편하다.

특별한 내용은 없지만 eventable_lock_test.cpp에서 21번 줄에 주의한다. unlock()을 하지 않으면 GCC와 달리 Visual Studio에서는 디버그 모드로 실행할 때 unlock of unowned mutex 메시지와 함께 프로그램을 바로 종료한다. 이는 Wrong message “unlock of unowned mutex”란 글에서 볼 수 있는 것처럼 호출하는 스레드에 해당 뮤텍스의 소유권이 있어야 하기 때문이다. 즉 해당 오류는 main()을 종료할 때 발생하는데 thread1()에서 wait() 이후 해당 뮤텍스 소유권을 유지하며, main()을 종료할 때는 주 스레드에 소유권이 없는 상태로 해제 시도하기 때문이다.

You may also like...