음 이것에 관련해서는 온라인서버제작모임에 명예의전당에 올라온 "Ciritical Section을 이용한 동기화 처리법"
을 보고 좀 고민하다가 리플에 GPG에 관련 또 글이 있어서 그거보고 제가 초금 개조 해봤습니다..

GPG에서 참고 한 글 링크 : http://www.gpgstudy.com/forum/viewtopic.php?t=10593
코딩할때 참고 한 글 링크 : http://ricanet.com/new/view.php?id=blog/050807
                                     http://ricanet.com/new/view.php?id=blog/050811a

class는 CCriticalSection 과 CSynchronized 2가지를 이용합니다.
 class CCriticalSection
{
private:
    CRITICAL_SECTION m_cs;

public:
    CCriticalSection(void)
    {
        ::InitializeCriticalSection( &m_cs );
    }
   
    virtual ~CCriticalSection(void)
    {
        ::DeleteCriticalSection( &m_cs );
    }

    void Lock(void)
    {
        ::EnterCriticalSection( &m_cs );
    }

    void Unlock(void)
    {
        ::LeaveCriticalSection( &m_cs );
    }
};

 class CSynchronized
{
private:
    CCriticalSection* m_pLock;

public:
    CSynchronized(CCriticalSection* _pLock) : m_pLock(_pLock)
    {
        m_pLock->Lock();
    }

    virtual ~CSynchronized(void)
    {
        m_pLock->Unlock();
    }

    operator bool()
    {
        return false;
    }
};

그리고 좀 깔끔하게 쓰기 위해서 define을 사용 하는데 아래와 같습니다.
 #define SYNCHRONIZED_BLOCK(CSif(CSynchronized _lock = CS) {} else   

자 이것에 대한 설명을 하자면
CriticalSection을 사용하다보면 EnterCriticalSection()걸고 LeaveCriticalSection()를 실행하지 않아 데드락에 빠지는
상황이 발생 할수 있습니다. 그것을 코드적으로 방지 하기 위해 생성자와 소멸자를 이용해서 만든것이 CCriticalSection 과 CSynchronized 입니다.


일단 간단하게 사용 방법을 설명하자면 아래와 같이 class에 CriticalSection을 상속 받습니다.
 class CTest :public CCriticalSection
{
public:
    CTest(void);
    ~CTest(void);

    char temp[128];
};

CriticalSection을 이용 할때는 아래와 같이 사용합니다.

CTest
test;                                                          // 변수 선언

{
     CSynchronized sync( &test );                           // EnterCriticalSection 실행

     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


하지만 위와 같은 방식은 코드를 보기에 뭔가 좀 직관적이지 않아서 (직관적이지 않다는것은 중괄호 안에 Lock를 사용한다고
선언하는것을 말함) Define을 사용해서 요것을 좀 바꿔본것입니다.
 
CTest
test;                                                          // 변수 선언

SYNCHRONIZED_BLOCK( &test )                          // EnterCriticalSection 실행
{
     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


by 널부러 2009. 3. 11. 18:03
| 1 |