커널 모드로 전환을 하지 않기 때문에 성능상 이점을 가진다.
크리티컬 섹션(Critical Section) 기반 동기화
화장실 열쇠라고 생각하면 된다. 임계 영역을 화장실이라고 하면 이 화장실에 들어가기 위해서는 열쇠가 필요하다. 즉, 한 사람이 쓰고 나와야 다른 사람이 사용할 수 있다는 것이다.
크리티컬 섹션 기반 동기화를 사용하기 위해 크리티컬 섹션 오브젝트를 만들고 초기화 해야 한다. 크리티컬 섹션 오브젝트는 CRITICAL_SECTION 자료형을 의미한다.
1.
CRITICAL_SECTION key; // 화장실 키 만듦
2.
크리티컬 섹션 오브젝트 초기화.
void WINAPI InitializeCriticalSection(
__out LPCRITICAL_SECTION lpCriticalSection
); // 키를 걸어둠.
3.
void WINAPI EnterCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection
); // 열쇠 획득 후 화장실 사용
만약 누군가가 이미 이 함수를 호출할 경우 호출된 함수는 블로킹 상태가 된다. 그리고 열쇠가 반환될 떄 까지 기다린다.
4.
void WINAPI LeaveCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection
); // 화장실 사용 후 열쇠를 제자리에
EnterCriticalSection함수를 호출하여 블로킹 상태에 놓인 쓰레드는 사용중인 쓰레드가 이 함수를 호출해야 화장실에 들어갈 수 있다.
화장실 키 생성 -> 키를 걸어두고 -> 키를 가지고 화장실 사용 -> 다시 키를 제자리로
위 순서라고 생각하면 된다.
한 순간에 하나의 쓰레드만 실행할 수 있도록 구성하는 것이 크리티컬 섹션 동기화 기법의 핵심이다.
DeleteCriticalsection을 이용하여 할당된 리소스들을 반환해야 한다.
인터락 함수(Interlocked Family Of Function) 기반의 동기화
변수 하나의 접근방식만 동기화 하려면 이 동기화 기법을 사용하는 것이 좋을 것이다.
LONG __cdecl InterlockedIncrement(
__inout LONG volatile *Addend
);
값을 하나 증가시킬 변수의 주소 값을 전달한다.
LONG __cdecl InterlockedDecrement(
__inout LONG volatile *Addend
);
값을 하나 감소시킬 변수의 주소 값을 전달한다.
int jdpb=10;
InterlockedIncrement(&jdpb);
두 함수를 통해 증감할 경우 동기화 된 상태에서 접근하는 것과 동일하게 사용이 가능하다. 즉, 하나의 쓰레드만 접근해주도록 해주는 함수이다.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683614(v=vs.85).aspx 에서 함수 참조 및 검색.
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
CreateThread, _beginthread, _beginthreadex 에 대한 정리 (0) | 2012.12.23 |
---|---|
쓰래드와 Sleep (0) | 2012.12.22 |
Critical Section [CPU가 여러개일때 동기화] (1) | 2012.11.01 |
MFC용 쓰래드 사용법 - MFC MultiThread (Work / UI Thread) (0) | 2012.11.01 |
CreateThread 함수 static으로 사용하지 않고 작성하기 (0) | 2012.11.01 |