//******************************************************************* // // FILE: CriticalSectionBase.h // // AUTHOR: - TTF(zone0000@dreamwiz.com) // // PROJECT: CriticalSection // // COMPONENT: CCriticalSectionBase // // DATE: 16.05.2007 // // COMMENTS: - v1.0 (2007.05.16) // Spin Count를 적용하여 윈도우 버전에 맞게 자동 선택 // try/catch문을 이용하여 동기화 객체 할당시 메모리 오류 assert 처리 // //******************************************************************* #pragma once #include// 스핀 카운트란? 싱글 Processor 시스템에서는 무시되는 항목이지만, // 멀티 Processor 시스템에서 Critical Section을 사용할 수 없을 때 // 세마포어와 연계되어 작동하는데, 세마포어는 커널 모드에서 작동하므로 // 호출되는 스레드가 유저모드에서 대기(busy-waiting) 상태로 남아 있을 경우에 // 더욱 효율적일 수 있다. // 요약 - 유저모드로 대기하는 스레드의 갯수에 대한 설정이다. class CCriticalSectionBase { public: #if (_WIN32_WINNT < 0x0403) CCriticalSectionBase() { __try { InitializeCriticalSection( &m_CS ); } __except( STATUS_NO_MEMORY == GetExceptionCode() ) { assert( !"Out Of Memory" ); } } #elif (_WIN32_WINNT >= 0x0403) CCriticalSectionBase( ULONG nSpinCount = 4000 ) { // SpinCount의 MS-SQL 기본값 : 4000 // 윈도우 2000에서는 아무리 많은 스핀 카운트를 쓰려고 하더라도 // 최상위 비트를 1로 세팅하지 말아야 한다.(MSDN 참조 - XP 이상은 최상위 비트가 무시된다.) // nSpinCount = 0x80000400; __try { BOOL bRet = InitializeCriticalSectionAndSpinCount( &m_CS, nSpinCount ); if( !bRet ) { assert( !"Out Of Memory" ); } } __except( STATUS_NO_MEMORY == GetExceptionCode() ) { assert( !"Out Of Memory" ); } } #endif ~CCriticalSectionBase() { DeleteCriticalSection( &m_CS ); // Critical Section 개체 삭제 } inline void Enter() { __try { EnterCriticalSection( &m_CS ); // Critical Section 진입(Lock) } __except(STATUS_NO_MEMORY == GetExceptionCode()) { assert( !"Out Of Memory" ); } } inline void Leave() { LeaveCriticalSection( &m_CS ); // Critical Section 해제(UnLock) } #if (_WIN32_WINNT >= 0x0403) inline ULONG SetSpinCount( ULONG nSpinCount ) { return( SetCriticalSectionSpinCount( &m_CS, nSpinCount ) ); } #endif #if(_WIN32_WINNT >= 0x0400) inline BOOL TryEnter() { return( TryEnterCriticalSection( &m_CS ) ); } #endif private: CRITICAL_SECTION m_CS; // Critical Section 개체 }; template class CMultiThreadSync { friend class CThreadSync; public: class CThreadSync { public: CThreadSync() { T::m_SyncObject.Enter(); } ~CThreadSync() { T::m_SyncObject.Leave(); } }; private: static CCriticalSectionBase m_SyncObject; }; template CCriticalSectionBase CMultiThreadSync ::m_SyncObject;
글 검색 결과
- 2007/05/16 [C++] 템플릿 기반 Critical Section 동기화 객체
- 2007/05/06 [C++] CRandom 클래스
- 2007/05/06 [C++] 템플릿 기반의 싱글톤 클래스
- 2007/04/15 [C++] CIni 클래스
- 2007/03/29 [OS 버전 알아내기] DtWinVer A comprehensive OS detection Class
- 2006/08/10 [MFC] CXPtrList - CPtrList를 상속 받아서 Critical Section으로 감싼거 (1)
[C++] 템플릿 기반 Critical Section 동기화 객체
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
add
- 댓글 남기기
[C++] CRandom 클래스
출처 : 온라인 게임 서버 프로그래밍
온라인 게임 서버 프로그래밍의 CRandom 클래스를 기반으로
GaussianRandom을 추가하여 작동하도록 수정하였다.
추가 수정 내용 : http://minjang.egloos.com/1223191
멀티 스레드에서 작동하도록...
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
add
- 댓글 남기기
[C++] 템플릿 기반의 싱글톤 클래스
#pragma once templateclass CSingleton { public: static T * InstancePtr() { if( ms_Instance == NULL ) ms_Instance = new T; return ms_Instance; }; static T & Instance() { if(ms_Instance == NULL) ms_Instance = new T; return *ms_Instance; }; static void DestroyInstance() { delete ms_Instance; ms_Instance = NULL; }; private: static T * ms_Instance; }; template T* CSingleton ::ms_Instance = 0;
#include "stdafx.h" #include#include "CSingleton.h" class CObject : public CSingleton { public: CObject() : m_nValue(10) {} ~CObject(); int m_nValue; int GetValue() { return m_nValue; } }; #define TIME CObject::Instance() int _tmain(int argc, _TCHAR* argv[]) { int time = TIME.GetTime(); return 0; }
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
add
- 댓글 남기기
[C++] CIni 클래스
CIni 클래스는 ini 파일을 읽고 쓸 수 있도록 만들어진 클래스이다.
2003년 이후 업데이트가 되지 않아서 문제점을 직접 수정하였다.
문제점 : strdup 함수 계열(_tcsdup)은 malloc로 메모리를 할당하기 때문에
free로 메모리를 해제해야 한다.
_tcsdup로 할당된 메모리 포인터는 모두 free()로 해제 해도록 수정하였다.
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
add
- 댓글 남기기
[OS 버전 알아내기] DtWinVer A comprehensive OS detection Class
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
add
- 댓글 남기기




CriticalSectionBase.h


CRandom.zip












