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 : 카운트 값이 변경되기 전 값을 저장할 변수의 포인터