CRITICAL_SECTION을 사용한 Lock 클래스 예제
"온라인 게임 서버 프로그래밍"에 있는 샘플 소스를 약간 수정한 샘플입니다. (이름 정도..? :D)

CMultiThreadSync는 CCriticalSection을 static 변수로 갖고
내부 클래스인 Lock 클래스의 생성/소멸자에서 CRITICAL_SECTION의 락 진입/해제를 관장합니다.

멀티 스레드에서의 Synchronization을 제공할 클래스는 CMultiThreadSync를 상속하여
(이때 Template로 자기자신을 지정함)
Lock 클래스 변수 정의 만으로 해당 코드의 블럭이 끝날때까지 동기화를 보장합니다.

매우 아름다운 모습인 것 같습니다.


샘플 코드
#include <windows.h>
#include <iostream>
using std::cout;
using std::endl;

//CRITICAL_SECTION의 wrapper 클래스
class CCriticalSection
{
public:
CCriticalSection(void)  {InitializeCriticalSection(&cs); }
~CCriticalSection(void) {DeleteCriticalSection(&cs); }
inline VOID Enter(void) {EnterCriticalSection(&cs); }
inline VOID Leave(void) {LeaveCriticalSection(&cs); }
private:
CRITICAL_SECTION cs;
};

//동기화를 사용할 클래스들을 위한 Parent(Base) 클래스
template <class T>
class CMultiThreadSync
{
public:
virtual ~CMultiThreadSync(){}
class Lock
{
public:
Lock(void) { T::mCS.Enter(); }
~Lock(void) { T::mCS.Leave(); }
};
private:
static CCriticalSection mCS;
};
template <class T> CCriticalSection CMultiThreadSync<T>::mSync;


//사용 방법
class A : public CMultiThreadSync<A> //A 클래스에 대해 공통적인 CriticalSection 생성
{
public:
void operation(void)
Lock sync; //블록을 벗어날때 자동으로 Lock이 풀림
//syncronized 작업 수행
}
};
class B : public CMultiThreadSync<B> //B 클래스에 대해 공통적인 CriticalSection 생성
{
public:
void operation(void)
{
Lock sync; //블록을 벗어날때 자동으로 Lock이 풀림
//syncronized 작업 수행
}
};

int main(void)
{
A a1;
a1.operation();

A a2;
a2.operation();

//위의 a1, a2가 멀티 스레드에서 호출될 경우
//CMultiThreadSync의 static CCriticalSection mCS에 의해
//A 클래스들에 대해 하나의 CRITICAL_SECTION을 갖게 되어 동기화가 이루어짐
return 0;
};