ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mutex와 Semaphore의 차이점과 사용방법
    Windows 프로그래밍 2019. 1. 3. 10:37


    Mutex와 Semaphore 둘 다 동기화 커널 객체라는 공통점이 있다.

    동기화 커널 객체는 멀티 쓰레드 환경에서 공통된 자원에 다수의 쓰레드가 동시에 접근하게 되어 발생하는 문제를 예방하기 위해 사용하는 것이다.


    약간 요론 느낌?


    그래서! Mutex와 Semaphore의 차이점이 뭐냐, Mutex는 한 번에 하나의 쓰레드 만이 자원에 접근할 수 있고, Semaphore는 한 번에 접근할 수 있는 쓰레드의 갯수를 생성 시에 지정할 수 있다.


    따라서 여러 쓰레드가 한 번에 자원에 접근하도록 하고 싶다면 Semaphore를 사용하고 그렇지 않은 경우에는 Mutex를 사용하면 될 것 같다. 그럼 이제 사용법을 알아보자.


    Mutex


    먼저 뮤텍스의 생성 및 사용법을 보자.

    뮤텍스는 CreateMutex() 라는 함수를 이용해 생성할 수 있다.

    이 함수에는 아래와 같은 3가지 인자가 들어가고 생성된 뮤텍스의 핸들을 반환해 준다.

    HANDLE CreateMutex( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, // 뮤텍스 커널 객체의 보안 속성 _In_ BOOL bInitialOwner, // 뮤텍스를 생성하는 쓰레드의 초기 뮤텍스 소유 여부 _In_opt_ LPCWSTR lpName // 뮤텍스 커널 객체의 이름 );

    첫 번째와 세 번째 인자에는 NULL을 주어도 무방하다.

    두 번째 인자 같은 경우에는 TRUE를 지정하면 CreateMutex 함수를 호출한 쓰레드가 초기에 생성되는 뮤텍스를 소유하게 된다. 그럼 다른 쓰레드는 해당 뮤텍스를 소유하지 못한 상태가 되며 자원에 접근할 수 없다.


    중요한 건 쓰레드 내부에서 WaitForSingleObject 함수를 이용해 다른 쓰레드의 Mutex 사용이 끝날 때 까지 기다려야 한다.

    첫 번째 인자로 뮤텍스의 핸들을 주고, 두 번째 인자로 무한정 기다리라는 의미로 INFINITE (0xFFFFFFFF 로 define되어 있다) 를 준다.


    자원을 더이상 사용하지 않아도 된다면 다음 쓰레드를 위해 양보해 주어야 한다. 이때 사용하는 함수는 ReleaseMutex() 이다. 인자는 CreateMutex를 통해 얻은 뮤텍스의 핸들 값만 넘겨주면 된다.

    BOOL ReleaseMutex(
        _In_ HANDLE hMutex
    );


    Semaphore


    방식은 Mutex와 같지만 함수로 넘겨주는 인자가 조금 다르다.

    Semaphore 같은 경우에는 CreateSemaphore() 라는 함수를 이용해 생성된다.

    HANDLE CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 세마포어 커널 객체의 보안 속성 _In_ LONG lInitialCount, // 세마포어 커널 객체의 초기 카운트 _In_ LONG lMaximumCount, // 세마포어 커널 객체의 최대 카운트 (일반적으로 초기 카운트와 같게 설정한다) _In_opt_ LPCWSTR lpName // 세마포어 커널 객체의 이름 );

    예를 들어 2개의 쓰레드가 한 번에 자원을 공유하게 만들고 싶다면

    CreateSemaphore(NULL, 2, 2, NULL);

    요로케 하면 된다. 아이 쉬워라~

    Semaphore에서도 WaitForSingleObject 함수를 이용해 기다려 주어야 한다.


    이제 Release 해주어야 한다. 이때 사용하는 함수는 짐작이 가겠지만 당연히 ReleaseSemaphore() 함수이다.

    이번에도 Mutex를 Release 해줄때 보다 더 많은 인자를 필요로 한다.

    BOOL ReleaseSemaphore( _In_ HANDLE hSemaphore, // 신호 카운트를 증가시킬 세마포어 커널 객체의 핸들 (말이 어렵지 그냥 Create한 핸들이다) _In_ LONG lReleaseCount, // 증가시키는 세마포어 카운트 (일반적으로 1을 사용한다) _Out_opt_ LPLONG lpPreviousCount // 증가되기 전의 세마포어 카운트 );

    세 번째 인자는 일반적으로 사용하지 않기 때문에 NULL을 주면 된다.


    이렇게 Mutex와 Semaphore의 차이점 및 사용법을 알아보았다. 어... 잼밌다 ㅎ

    'Windows 프로그래밍' 카테고리의 다른 글

    Volatile 변수란?  (2) 2019.01.07
    Service 프로세스에서 winlogon.exe  (0) 2019.01.03
    OnTimer 함수  (0) 2019.01.03
    화면 캡쳐와 Printwindow 함수  (6) 2019.01.02
    뮤텍스란?  (2) 2019.01.02

    댓글

Designed by Tistory.