본문 바로가기
개발/WinAPI

Semaphore

by 사과잼빵 2017. 1. 9.

Semaphore는 커널 오브젝트의 일종으로 동기화에 사용되는데 커널 오브젝트이다보니 유저모드에서 커널모드 전환이 일어나기때문에 CriticalSection보다 성능면에서 떨어 질 수 있다. 하지만 순서를 동기화 시키기 위해 어떤 작업들이 순서대로 일어나야 할 경우 사용 될 수 있다.

#include <windows.h>

HANDLE CreateSemaphore

(
    LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    LONG initialCount,
    LONG MaximumCount,
    LPCTSTR lpName
);

initialCount는 세마포어의 초기 상태 값을 나타내는데 0일 경우 non-signaled이고 1이상일 경우 signaled상태이다. 1이상일 경우 세마포어를 소유할 수 있는 상태이다.


MaximumCount는 세마포어를 소유 할 수 있는 최대 수이다.

n의 값으로 설정했을 경우 n만큼의 쓰레드들이 세마포어를 얻을 수 있다.


WaitForSignleObject 함수를 통해 세마포어를 획득 할 수 있고

ReleaseSemaphore 함수를 통해 세마포어를 반환 할 수 있다.


BOOL ReleaseSemaphore

(
     HANDLE hSemaphore,
     LONG    ReleaseCount,
     LPLONG lpPreviousCount
);


ReleaseCount : 반환할 세마포어의 카운트이다 이 숫자 만큼 세마포어의 카운트가 올라간다.

lpPreviousCount : 카운트 값이 변경되기 전 값을 저장할 변수의 포인터