본문 바로가기

Windows/MFC

[thread] Critical Section 임계영역

같은 프로세스의 스레드들을 상호 배제하기 위해 win32에서는 임계영역을 사용할 수 있다.

임계 영역은 한번에 하나의 스레드만 들어갈 수 있고 들어가 있는 상태에서 타 쓰레드는 모두 블럭 당한다.

사용을 하기 위해서는 InitializeCriticalSection 함수를 호출함으로서 이루어진다.

[code]void InitialCriticalSection(LPCRITICAL_SECTION lpCriticalSection);[/code]

이 함수는 절대로 실패하지 않으며 임계 영역에는 관련된 HANDLE 이 존재하지 않는다. 또 이함수는

SECURITY_ATTRIBUTES 매개 변수가 사용되지 않는다. 이런 사실은 임계영역이 커널 객체가 아니라는 증거가 될 수 있다. 같은 프로세스 안에서 다수의 스레드에 의해 공유되는 데이터에 접근을 시도하기 전에 임계영역을 획득하기 위해서는

[code]VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);[/code]

을 이용하면 된다.

이 함수는 시간 초과 매개 변수가 없다는 사실에 주의해야 한다.

TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) 는 임계영역에 블러킹 없이 진입하고자 할 때 사용하는 함수이다.

InitialCriticalSection 함수에 의해 할당된 자원을 해제 하려면

[code]DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);[/code]
를 이용하면 된다.


Example
[code]
CRITICAL_SECTION cs;

// 사용하기 전에 임계 영역을 초기화 한다.
InitializeCritialSection(&cs);

// 임계 영역에 들어간다.
EnterCriticalSection(&cs);

// 임계영역에 들어가려고 시도한다.
BOOLEAN bStatus = TryEnterCriticalSection(&cs);

// 임계영역을 떠난다.
LeaveCriticalSection(&cs);

// try enter critical section 이 성공한 경우에는 다시 한번 나가야 한다.
if (bStatus)
    LeaveCriticalSection(&cs);

// 임계 영역의 사용이 끝나면 삭제한다.
DeleteCriticalSection(&cs);

[/code]

'Windows > MFC' 카테고리의 다른 글

WaitForSingleObject 함수 와 WaitForMultipleObject 함수  (0) 2013.10.02
대기 하는데 사용할 수 있는 커널 객체  (0) 2013.10.02
[thread] Interlocked  (0) 2013.10.02
CreatePorcess  (0) 2013.10.02
About Kernel Object  (0) 2013.10.02