반응형


복사http://blog.naver.com/jdpb13/80166370289

커널 모드로 전환을 하지 않기 때문에 성능상 이점을 가진다.

크리티컬 섹션(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 에서 함수 참조 및 검색.

반응형

+ Recent posts