ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 뮤텍스와 WaitForSingleObject 함수
    개발/C++ 2019. 11. 1. 17:29

    시스템 관련한 어느 책에서 뮤텍스 동기화를 설명하면서 WaitForSingleObject를 이용해 뮤텍스를 '획득'한다고 표현한다. CRITICAL_SECTION으로 유저 모드 동기화에도 거의 비슷한 표현을 하는데 잘 와닿지 않는다. 결과적으로는 획득이라는 표현은 아무 문제 없다고 반문한다면, 손가락이 언제나 달을 가리키고 있다고 해서 손가락을 보고 달이라고 할 수 없지 않은 것인가, 라고 대답하고 싶다.

     

    뮤텍스를 생성하는 함수는 CreateMutex()로 세 개의 인자를 넣어줘야 한다. 그 중 두 번째 인자가 BOOL bInitialOwner로 TRUE를 넣으면 뮤텍스를 생성하는 스레드에서 해당 뮤텍스 사용하고 FALSE를 넣으면 어느 스레드가 되었던 먼저 사용하는 쪽이 임자다. 즉, TRUE에서는 뮤텍스가 non-signaled 상태로 생성되고 FALSE는 signaled 상태의 뮤텍스를 생성한다는 의미다. 뮤텍스로 동기화를 진행할 때 WaitForSingleObject를 쓸 수 있는 이유는 이 함수의 첫 번째 인자인 커널 오브젝트가 signaled 상태일 때 함수가 반환되고 해당 커널 오브젝트가 자동 리셋 모드일 경우에 상태를 바로 non-signaled로 상태를 바꾸기 때문이다. 때문에 다른 스레드에서 임계영역에 실행제어를 들이고 싶어도 WaitForSingleObject 함수가 반환되지 않기 때문에 동기화가 가능한 것. 임계영역을 빠져 나오면서 ReleasMutex 함수를 호출해야 뮤텍스가 signaled로 바뀐다.

     

    '획득'했다기 보다는 '사용'이 개념상 더 맞지 않을까 싶다. 획득에는 반납의 과정이 필요한데, 실제로 뮤텍스를 이용한 동기화는 signaled와 non-signaled를 이용해 WaitForSingleObject 함수의 블락 여부로 동기화를 진행할 뿐이지 무언가를 반납하지 않는다. 특정 스레드에서 커널 오브젝트의 상태가 non-signaled라면, 스레드가 해당 오브젝트를 사용하고 있다는 뜻이다. 결과적으로 소유 또는 획득이라는 표현이 불가능한 것은 아니나 손가락은 여전히 손가락일 뿐이다.

    댓글

Designed by Tistory.