ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 크리티컬 섹션
    쓰레드/쓰레드 2022. 4. 3. 16:42

    크리티컬 섹션은 "임계 영역" 이라 번역할 수 있는데 공유 자원의 독점을 보장하는 코드의 한 영역이라고 할 수 있다.

     

    크리티컬 섹션은 다음 두 함수로 초기화 및 파괴를 한다.

     

       void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

       void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

     

    둘 다 CRITICAL_SECTION 형의 포인터를 인수로 요구하므로 해당 타입의 변수를 선언하여 주소값을 넘겨주어야 한다.

    단 이 변수는 복수 개의 스레드가 참조해야 하므로 반드시 전역 변수로 선언해야 한다.

     

     

    다음 두 함수가 실제로 크리티컬 섹션을 구성하는 함수이다.

     

      void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

      void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

     

    이 두 함수 사이의 코드가 바로 크리티컬 섹션, 즉 임계영역이 된다.

     

    EnterCriticalSection API는 이 코드가 크리티컬 섹션을 소유하도록 해 주며 이후부터 다른 스레드는 같은 크리티컬 섹션에 들어올 수 없게 된다.

    만약 EnterCritical Section이 호출될 때 이미 다른 스레드가 크리티컬 섹션에 들어와 있으면 이 함수는 크리티컬 섹션이 해제(LeaveCriticalSection)될 때까지 안전하게 대기하도록 한다.

     


    사용 예)

     

    전 시간에 사용한 고양이 강아지 출력 코드 변경!

    WM_CREATE : InitializeCriticalSection 초기화

    WM_DESTROY : DeleteCriticalSection  파괴

    for()구문 공유자원 x에 값을 넣고 출력 할때까지 임계영역 설정!!

     

    결과를 보면 원하는 위치에 잘 나온걸 확인 할 수 있다.

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

    세마포어  (0) 2022.04.03
    뮤텍스  (0) 2022.04.03
    스레드 간 동기화 ,동기화가 필요한 이유  (0) 2022.04.03
    스레드 생명 주기 + 우선순위  (0) 2022.04.03
    beginThread & TLS  (0) 2022.04.03

    댓글

Designed by Tistory.