::NPTEAM:: Network Programer Team

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[C++] 템플릿 기반 Critical Section 동기화 객체




//*******************************************************************
//              
//  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 03:40 2007/05/16 03:40

맨 위로

[C++] CRandom 클래스

출처 : 온라인 게임 서버 프로그래밍



온라인 게임 서버 프로그래밍의 CRandom 클래스를 기반으로

GaussianRandom을 추가하여 작동하도록 수정하였다.


추가 수정 내용 : http://minjang.egloos.com/1223191
멀티 스레드에서 작동하도록...
2007/05/06 17:37 2007/05/06 17:37

맨 위로

[C++] 템플릿 기반의 싱글톤 클래스



#pragma once

template 
class 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;
}
2007/05/06 04:22 2007/05/06 04:22

맨 위로

[C++] CIni 클래스


CIni 클래스는 ini 파일을 읽고 쓸 수 있도록 만들어진 클래스이다.

2003년 이후 업데이트가 되지 않아서 문제점을 직접 수정하였다.

문제점 : strdup 함수 계열(_tcsdup)은 malloc로 메모리를 할당하기 때문에
           free로 메모리를 해제해야 한다.

_tcsdup로 할당된 메모리 포인터는 모두 free()로 해제 해도록 수정하였다.

2007/04/15 15:41 2007/04/15 15:41

맨 위로

[OS 버전 알아내기] DtWinVer A comprehensive OS detection Class



Vista까지의 운영체제 버전 및 서비스 팩 버전까지 상세히 알려주는 클래스
2007/03/29 06:29 2007/03/29 06:29

맨 위로

[MFC] CXPtrList - CPtrList를 상속 받아서 Critical Section으로 감싼거

CXPtrList

CPtrList를 상속 받아서 Critical Section으로 감싼 클래스
2006/08/10 13:07 2006/08/10 13:07

맨 위로