글
음 이것에 관련해서는 온라인서버제작모임에 명예의전당에 올라온 "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가지를 이용합니다.
그리고 좀 깔끔하게 쓰기 위해서 define을 사용 하는데 아래와 같습니다.
자 이것에 대한 설명을 하자면
CriticalSection을 사용하다보면 EnterCriticalSection()걸고 LeaveCriticalSection()를 실행하지 않아 데드락에 빠지는
상황이 발생 할수 있습니다. 그것을 코드적으로 방지 하기 위해 생성자와 소멸자를 이용해서 만든것이 CCriticalSection 과 CSynchronized 입니다.
일단 간단하게 사용 방법을 설명하자면 아래와 같이 class에 CriticalSection을 상속 받습니다.
CriticalSection을 이용 할때는 아래와 같이 사용합니다.
하지만 위와 같은 방식은 코드를 보기에 뭔가 좀 직관적이지 않아서 (직관적이지 않다는것은 중괄호 안에 Lock를 사용한다고
선언하는것을 말함) Define을 사용해서 요것을 좀 바꿔본것입니다.
을 보고 좀 고민하다가 리플에 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(CS) if(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 실행 |
RECENT COMMENT