출처 : http://anyflow.egloos.com/776075

 

커널 객체를 이용한 쓰래드 동기화(4) - 세마포어

제프리 릭터의 Programming Applications for Microsoft Windows에 담긴 내용입니다.

세마포어(semaphore) 커널 객체 : 리소스 카운팅에 이용된다. 사용 카운트 외에도 두 개의 부호없는 32비트 값(최대 리소스 카운트, 현재 리소스 카운트)을 갖는다. 최대 리소스 카운트는 세마포어가 제어할 수 있는 최대 리소스 갯수를 나타내고, 현재 리소스 카운트는 현재 사용 가능한 리소스의 갯수를 나타낸다.

세마포어가 따르는 규칙
  • 현재 리소스 카운트가 0보다 크면, 세마포어는 신호 상태에 있다.
  • 현재 리소스 카운트가 0이면, 세마포어는 비신호 상태에 있다.
  • 시스템은 세마포어의 현재 리소스 카운트가 음수가 되는 것을 허용하지 않는다.
  • 현재 리소스 카운트는 최대 리소스 카운트보다 클 수 없다.
    HANDLE CreateSemaphore (
        PSECURITY_ATTRIBUTE psa,
        LONG lInitialCount,
        LONG lMaximumCount,
        PCTSTR pszName );

    lInitialCount : 현재 가능한 리소스의 갯수. 초기값으로 임의의 수를 정할 수 있다.
    lMaximumCount : 가능한 리소스의 최대 갯수

    HANDLE OpenSemaphore (
        DWORD fdwAccess,
        BOOL bInheritHandle,
        PCTSTR pszName );

    //이 함수는 단지 세마포어의 현재 리소스 카운트에
    //lReleaseCount의 값을 더한다.
    //plPreviousCount더하기 전의 현재 리소스 카운트
    BOOL ReleaseSemaphore (
        HANDLE hsem,
        LONG lReleaseCount,
        PLONG plPreviousCount );
  • 안정적인 DNS서비스 DNSEver DNS server, DNS service
    Posted by 키르히아이스
    ,