ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세마포어
    쓰레드/쓰레드 2022. 4. 3. 17:31

    뮤텍스는 하나의 공유 자원을 보호하기 위해 사용하지만 세마포어는 그렇지 않다.

    세마포어는 제한된 일정 개수를 가지는 자원을 보호하고 관리한다.

     

    세마포어는 사용가능한 자원의 개수를 카운트하는 동기화 객체이다.

     

    유효 자원이 0이면 세마포어는 비신호상태가 되며 1이상이면신호상태

     

    세마포어 0 하나 이상
    스레드를 블록시켜 사용가능한 자원이 생길 때까지 대기 유효 자원의 개수를 1 감소시키고 곧바로 리턴.

     

    세마 포어를 생성하고 생성된 세마포어의 핸들을 획득하는 함수

     

       HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTE lpSemaphoreAttributes,

                     LONG llnitialCount, LONG lMaximumCount, LPCTSTR lpName);

     

      HANDLE OpenSemaphore(DWORD dwDesiredAccess, BOOL bInheritHandle,

                                        LPCTSTR lpName);

     

    CreateSemaphore 의 첫 번째 인자는 주로 NULL을 사용한다.

    두 번째 인자 :  초기 카운트 값을 지정한다.

    세 번째 인자 :  최대 카운트 값을 지정한다.

    네 번째 인자 :  이름이며 이 인자를 통해 프로세스간 동기화가 가능해 진다.

     

     

       BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount,

                                        LPLONG lpPreviousCount);

     

    자원의 사용이 끝난 스레드는 위의 함수를 호출하여 사용 종료를 알린다.

     

    뮤텍스의 Release 함수와의 차이점

     뮤텍스에서는 뮤텍스를 소유한 스레드나 프로세스가 해당 함수를 호출할 때만 유효한 기능이 되지만,

     세마포어는 누구라도 몇 번이라도 해당 함수를 호출 할 수 있다. 따라서 조심해서 사용할 필요가 있다.

     


    사용 예)

     

    위 프로그램을 4번 이상 실행

     

    3개의 프로그램은 세마포어를 획득했지만, 4번째 실행한 프로그램은 접근하지 못함을 알 수 있다.

     

     

    임의의 하나의 프로그램에서 메시지 박스를 종료한 후의 상황

    대기하고 있던 프로그램이 세마 포어를 획득함을 볼 수 있다.

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

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

    댓글

Designed by Tistory.