ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 뮤텍스
    쓰레드/쓰레드 2022. 4. 3. 17:19

    뮤텍스는 크리티컬 섹션과 여러 가지 면에서 비슷하므로 크리티컬 섹션이 쓰이는 곳에 대신 사용될 수 있다.

     

    그러나 이름을 가짐으로써 프로세스간에도 사용될 수 있다는 점에 있어 크리티컬 섹션보다는 더 우월한 존재라고 할 수 있다. 그만큼 속도는 느리다 .

     

    뮤텍스는 오직 한 스레드에 의해서만 소유될 수 있으며, 일단 어떤 스레드에게 소유되면 비신호상태가 된다.

    반대로 어떤 스레드에도 소유되어 있지 않은 상태라면 신호상태가 된다.

     

     

    이 함수는 뮤텍스를 생성한 후 그 핸들을 리턴해 준다.

     

       HANDLE CreateMutex(LPSECURITY_ATTRIBUTE lpMutex, BOOL bInitialOwner,

                                    LPCTSTR lPName);

     

    첫 번째 인자 : 대개의 경우 NULL을 준다.

     

    두 번째 인자 : 뮤텍스를 생성함과 동시에 소유할 것인지 지정 값이 TRUE이면 이 스레드가 뮤텍스를 소유하며

                       뮤텍스가 비신호 상태로 생성됨으로 다른 스레드는 이 뮤텍스를 소유할 수 없다.

     

    세 번째 인자 :  뮤텍스의 이름을 지정

                        뮤텍스는 프로세스끼리의 동기화에도 사용되므로 이름을 가지는 데 이 이름은 프로세스간에 뮤텍스를                        공유할 때 사용된다.

     

    뮤텍스에 이름이 있을 경우 다른 프로세스가 일단 뮤텍스의 이름만 알면 다음 함수로 뮤텍스의 핸들을 얻을 수 있다.

    만약 동일한 이름으로 CreateMutex를 한 번 더 호출하면 아래 함수처럼 동작하게 된다.

     

       HANDLE OpenMutex(DWORD dwDesiredAccess, BOOL bInheritHandle,

                                    LPCTSTR lpName);

     

    만약 뮤텍스를 소유한 상태에서 뮤텍스를 반납하기를 원한다면 아래 함수를 호출하면 된다. 해당 함수가 호출되면 뮤텍스는 비신호 상태에서 신호상태로 변경된다.

     

       BOOL ReleaseMutex(HANDLE hMutex);

     

    생성한 뮤텍스를 파괴할 때는 모든 커널 객체와 마찬가지로 CloseHandle 함수를 사용하면 된다.


     

    뮤텍스 예제)

     

    위 프로그램을 종료하지 않은 상태에서 2번 반복 실행

     

    첫 번째 프로그램이 실행될 때 : 시그널 상태이기 때문에 뮤텍스를 소유하게 된다. 

                                             하지만두 번째 프로그램이 실행될때는 뮤텍스가 넌 시그널 상태이기 때문에 뮤텍스를                                             소유하지 못하고 기다리게 된다.

     

    만약 첫 번째 프로그램에서 메시지 박스를("뮤텍스를 놓는다.")호출하면 ReleaseMutex  API를 호출하기 때문에 두 번째 프로세스가 뮤텍스를 소유하게 된다.

     

     

    첫 번째 프로그램이 메시지 박스를 종료 한 후 상황이다.

     

     

    뮤텍스를 소유한 프로세스가 뮤텍스를 ReleaseMutex API를 호출하지 않은 상태에서 종료되면 해당 결과가 발생된다.

    이를 포기된 뮤텍스라 한다.

     

    만약 포기된 뮤텍스를 받았다는 것은 스레드 코드에 버그가 있다는 뜻이다. 관련 스레드가 보통 정상 종료되지 못했음을 나타낸다.

    '쓰레드 > 쓰레드' 카테고리의 다른 글

    이벤트  (0) 2022.04.05
    세마포어  (0) 2022.04.03
    크리티컬 섹션  (0) 2022.04.03
    스레드 간 동기화 ,동기화가 필요한 이유  (0) 2022.04.03
    스레드 생명 주기 + 우선순위  (0) 2022.04.03

    댓글

Designed by Tistory.