-
크리티컬 섹션은 "임계 영역" 이라 번역할 수 있는데 공유 자원의 독점을 보장하는 코드의 한 영역이라고 할 수 있다.
크리티컬 섹션은 다음 두 함수로 초기화 및 파괴를 한다.
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