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;
};
'C++' 카테고리의 다른 글
파일 비동기 IO 조작 (Async IO) (0) | 2011.01.18 |
---|---|
SEH (Structured Exception Handling) 예외처리 (0) | 2011.01.12 |
윈도우 GUI에서 콘솔(console) 띄우기 (0) | 2011.01.11 |
Windows 접근 제어 (0) | 2011.01.11 |
Design Patterns (디자인 패턴) (0) | 2011.01.06 |
POSA (Pattern-Oriented Software Architecture) (0) | 2011.01.03 |
ACE (ADAPTIVE Communication Environment) (0) | 2011.01.03 |
UML class 관계 표기법 (1) | 2011.01.03 |