SlideShare a Scribd company logo
Reference CountingCGCIICho sanghyun’s Game Classes II
 다중 쓰레드 환경에서 동작해야 함으로 당연히 쓰레드 안전 (Thread-Safe) 하게 동작된다 .
 CGCII 의 모든 동적 생성 객체는 참조계수 (Reference Count) 를 사용하여 소멸 처리 한다 .
IUnkonwned CComPtr<T>
shared_ptr<T>
• 가장 많이 알려진 ‘스마트 포인터’
• weak_ptr<T> 등과 연동하여 사용하기 편리하다 .
• 하지만 Thread-Safe 하지 않다 .
• 내부적으로 참조계수를 추가적으로 생성한다 .
• COM 에서 사용하는 ‘스마트포인터’지원
• Thread-Safe 하게 만들 수는 있다 .
• 참조계수는 IUnknowned 클래스의 가상 함수에 의
존한다 . (AddRef, Release)
• IC 이 클래스와 유사하다 .
ICGReferenceCount CGPTR<T>
• IUnknowned, CComPtr<T> 와 거의 유사하다 .
• 다만 AddRef, Release 가 가상함수가 아니고
OnFinalRelease() 함수를 가상함수로 두었다 .
• AddRef/Release 는 Thread-Safe 하게 동작한다 .
CGCIICho sanghyun’s Game Classes II
참조계수 (ReferenceCount)?참조계수
class ICGReferenceCount
{
protected:
ICGReferenceCount() {}
virtual ~ICGReferenceCount() {}
public:
long AddRef() { return m_Counter.increment();}
long Release();
protected:
virtual void OnFinalRelease() PURE;
private:
Interlocked_long m_Counter;
};
class ICGReferenceCount
{
protected:
ICGReferenceCount() {}
virtual ~ICGReferenceCount() {}
public:
long AddRef() { return m_Counter.increment();}
long Release();
protected:
virtual void OnFinalRelease() PURE;
private:
Interlocked_long m_Counter;
};
long ICGReferenceCount::Release()
{
long result=m_Counter.decrement();
if(result==0)
OnFinalRelease();
return result;
}
long ICGReferenceCount::Release()
{
long result=m_Counter.decrement();
if(result==0)
OnFinalRelease();
return result;
}
1. 참조계수를 위한 변수
(Interlocked 로 동작하며 0 으로 초기화 )
2. 참조계수 증가 AddRef()
참조계수 감소 Release()
3. 참조계수 감소 Release() 로 참조 계수가 0 이 되면
OnFinalRelease() 함수 호출 !
4. OnFinalRelease() 함수는 순수가상 함수로 정의 !
 ICGReferenceCount 는 기본적으로 IUnknown 와 유사하다 .
CGCIICho sanghyun’s Game Classes II
ICGReferenceCount (1)참조계수
 참조계수를 적용한 동적 객체를 위해서 ICGReferenceCount 는 상속해서 사용함 .
 순수가상함수인 OnFinalRelease() 함수를 재정의하여 사용함 .
class foo: virtual public ICGReferenceCount
{
public:
foo() {}
virtual ~ foo() {}
…
protected:
virtual void OnFinalRelease() { delete this; }
…
};
class foo: virtual public ICGReferenceCount
{
public:
foo() {}
virtual ~ foo() {}
…
protected:
virtual void OnFinalRelease() { delete this; }
…
};
1. ICGReferenceCount 를 상속 (virtual public 으로 )
2. OnFinalRelease() 함수의 재정의 !
( 일반적으로 자기자신을 지우도록 정의 )
{
foo* pObject = new foo;
pObject->AddRef();
…
pObject->Release();
}
{
foo* pObject = new foo;
pObject->AddRef();
…
pObject->Release();
}
5. 참조계수 증가시키기 ! ( 이때 참조계수는 1)
4. 생성 ! ( 이때 참조계수는 0)
6. 참조계수 감소시키기 !
( 이때 참조계수는 0 이 되며 OnFinalRelease() 가 호출 )
CGCIICho sanghyun’s Game Classes II
ICGReferenceCount (2)참조계수
 일일이 수동으로 참조계수를 증가 / 감소 시키는 것은 완전히 시르고 귀찮다 !!!
 그래서 CGPTR<T>(CGD::shared_object<T>) 클래스가 있다 !
template <typename TREF>
class CGPTR
{
public:
CGPTR() : m_ref(nullptr) {}
CGPTR(TREF* _ref) : m_ref(_ref) { if(_ref!=nullptr) _ref->AddRef();}
CGPTR(const CGPTR <TREF>& _ref) : m_ref(_ref.get()) { if(m_ref!=nullptr) m_ref->AddRef();}
~ CGPTR() { if(m_ref!=nullptr) m_ref->Release();}
public:
CGPTR<TREF>& operator=(TREF* _rhs) { _reset(_rhs); return (*this);}
CGPTR<TREF>& operator=(const CGPTR<TREF>& _rhs){ _reset(_rhs.get()); return (*this);}
…
protected:
TREF* m_ref;
void _reset()
{
if(m_ref==nullptr) return;
m_ref->Release();
m_ref=nullptr;
}
void _reset(TREF* _ref) // _ref 를 AddRef() 하고 m_ref 를 Release() 한다 .
…
};
template <typename TREF>
class CGPTR
{
public:
CGPTR() : m_ref(nullptr) {}
CGPTR(TREF* _ref) : m_ref(_ref) { if(_ref!=nullptr) _ref->AddRef();}
CGPTR(const CGPTR <TREF>& _ref) : m_ref(_ref.get()) { if(m_ref!=nullptr) m_ref->AddRef();}
~ CGPTR() { if(m_ref!=nullptr) m_ref->Release();}
public:
CGPTR<TREF>& operator=(TREF* _rhs) { _reset(_rhs); return (*this);}
CGPTR<TREF>& operator=(const CGPTR<TREF>& _rhs){ _reset(_rhs.get()); return (*this);}
…
protected:
TREF* m_ref;
void _reset()
{
if(m_ref==nullptr) return;
m_ref->Release();
m_ref=nullptr;
}
void _reset(TREF* _ref) // _ref 를 AddRef() 하고 m_ref 를 Release() 한다 .
…
};
CGCIICho sanghyun’s Game Classes II
CGPTR (1)참조계수
 일일이 AddRef()/Release() 대신 CGPTR<T> 를 쓰면 아래처럼 쓸 수 있다 .
{
foo* pObject = new foo;
pObject->AddRef();
…
pObject->Release();
}
{
foo* pObject = new foo;
pObject->AddRef();
…
pObject->Release();
}
{
CGPTR<foo> pObject = new foo;
…
}
{
CGPTR<foo> pObject = new foo;
…
}
CGCIICho sanghyun’s Game Classes II
CGPTR<T> (2)참조계수
ICGReferenceCount
Releaser
 매번 OnFinalRelease() 함수를 재정의하는 것도 귀찮으다 !
class foo: virtual public ICGReferenceCount
{
…
protected:
virtual void OnFinalRelease() { delete this; }
};
class foo: virtual public ICGReferenceCount
{
…
protected:
virtual void OnFinalRelease() { delete this; }
};
너무 뻔하다 !!!
namespace CGReleaser
{
class NDelete: virtual public ICGReferenceCount
{
public:
virtual ~ NDelete() {}
protected:
virtual void OnFinalRelease() { delete this; }
…
};
}
namespace CGReleaser
{
class NDelete: virtual public ICGReferenceCount
{
public:
virtual ~ NDelete() {}
protected:
virtual void OnFinalRelease() { delete this; }
…
};
}
아무것도 없고 !! 이것만 달랑 ~
 Releaser 를 만들어 다중 상속하여 사용한다 .
class foo: public CGReleaser::NDelete
{
…
};
class foo: public CGReleaser::NDelete
{
…
};
Releaser 를 상속받는 것만으로 끝 !!!
 그래서…
CGCIICho sanghyun’s Game Classes II
Release참조계수
 Releaser 를 상속받는 것도 귀찮으다 !! 그리고 상황에 따라 Releaser 가 변경될 수도 있다 !!!
 그래서 NEW<T> 를 제공한다 !!!
class foo: virtual public ICGReferenceCount
{
…
};
class foo: virtual public ICGReferenceCount
{
…
};
단지 ICGReferenceCount 만 virtual
public 으로 상속받아서…
template <typename T>
CGPTR<T> NEW()
{
class TCREATE : public T, public CGReleaser::Ndelete
{
};
return new TCREATE();
};
template <typename T>
CGPTR<T> NEW()
{
class TCREATE : public T, public CGReleaser::Ndelete
{
};
return new TCREATE();
};
Nested class TCREATE
T 와 Releaser 를 다중상속 받는다 !!!
TCREATE 를 생성해 리턴 한다 !
 NEW<T> 를 사용하면 Releaser 를 상속받거나 OnFinalRelease() 함수를 재정의하지 않고
그냥 ICGReferenceCount 만 상속받으면 된다 !!!!
{
CGPTR<foo> pObject = NEW<foo>();
}
{
CGPTR<foo> pObject = NEW<foo>();
}
 자동으로 Releaser 를 붙여주기 때문에 NEW<T> 를 사용하면 생성 가능하다 !!!
CGCIICho sanghyun’s Game Classes II
NEW<T> 함수 (1)참조계수
 그래서 앞으로 CGCII 의 일반적으로 동적 생성이 되는 객체는 ICGReferenceCount 만 상속받으며 ..
class foo: virtual public ICGReferenceCount
{
…
};
class foo: virtual public ICGReferenceCount
{
…
};
CGPTR<foo> pObject = NEW<foo>();CGPTR<foo> pObject = NEW<foo>();
 NEW<T> 함수를 사용하여 생성하고…
 생성된 포인터는 CGPTR<T> 에 저장하여 보관한다 .
 아니 그럼 !!! 어차피 거의 다 OnFinalRelease() 에 ‘ delete this’ 할 것이면 뭣 하러 가상함수로 만들었
나 ???
→ 왜 필요한 가는 Pool 을 한 후 설명 !!
CGCIICho sanghyun’s Game Classes II
NEW<T> 함수 (2)참조계수
CGCIICho sanghyun’s Game Classes II
질문 ?참조계수
중간 질문 ?
Ad

More Related Content

What's hot (20)

MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
Seungmo Koo
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Git을 조금 더 알아보자!
Git을 조금 더 알아보자!
Young Kim
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
강 민우
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
MinGeun Park
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
KyeongWon Koo
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
Seungmo Koo
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Git을 조금 더 알아보자!
Git을 조금 더 알아보자!
Young Kim
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
강 민우
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
MinGeun Park
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
KyeongWon Koo
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 

Viewers also liked (7)

GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group SystemGCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
상현 조
 
[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template
Seok-joon Yun
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group SystemGCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
상현 조
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
상현 조
 
[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template[KOSSA] C++ Programming - 14th Study - template
[KOSSA] C++ Programming - 14th Study - template
Seok-joon Yun
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Ad

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (1) (20)

Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
JinTaek Seo
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
Dong Chan Shin
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
HyunJoon Park
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
Sungkyun Kim
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
HyeonSeok Choi
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
MinGeun Park
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
 
창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료
유명환 FunFun Yoo
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
Hwan Min
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GDG Korea
 
2D games with iOS or Corona
2D games with iOS or Corona2D games with iOS or Corona
2D games with iOS or Corona
EungShik (Henry) Kim
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee
 
Klaytn Developer Meetup_20191022
Klaytn Developer Meetup_20191022Klaytn Developer Meetup_20191022
Klaytn Developer Meetup_20191022
Klaytn
 
Effective modern cpp item18, 19
Effective modern cpp item18, 19Effective modern cpp item18, 19
Effective modern cpp item18, 19
진화 손
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
진현 조
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
JinTaek Seo
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
Dong Chan Shin
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
HyunJoon Park
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
Sungkyun Kim
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
HyeonSeok Choi
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
MinGeun Park
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
 
창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료
유명환 FunFun Yoo
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
Hwan Min
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GDG Korea
 
Klaytn Developer Meetup_20191022
Klaytn Developer Meetup_20191022Klaytn Developer Meetup_20191022
Klaytn Developer Meetup_20191022
Klaytn
 
Effective modern cpp item18, 19
Effective modern cpp item18, 19Effective modern cpp item18, 19
Effective modern cpp item18, 19
진화 손
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
진현 조
 
Ad

GCGC- CGCII 서버 엔진에 적용된 기술 (1)

  • 2.  다중 쓰레드 환경에서 동작해야 함으로 당연히 쓰레드 안전 (Thread-Safe) 하게 동작된다 .  CGCII 의 모든 동적 생성 객체는 참조계수 (Reference Count) 를 사용하여 소멸 처리 한다 . IUnkonwned CComPtr<T> shared_ptr<T> • 가장 많이 알려진 ‘스마트 포인터’ • weak_ptr<T> 등과 연동하여 사용하기 편리하다 . • 하지만 Thread-Safe 하지 않다 . • 내부적으로 참조계수를 추가적으로 생성한다 . • COM 에서 사용하는 ‘스마트포인터’지원 • Thread-Safe 하게 만들 수는 있다 . • 참조계수는 IUnknowned 클래스의 가상 함수에 의 존한다 . (AddRef, Release) • IC 이 클래스와 유사하다 . ICGReferenceCount CGPTR<T> • IUnknowned, CComPtr<T> 와 거의 유사하다 . • 다만 AddRef, Release 가 가상함수가 아니고 OnFinalRelease() 함수를 가상함수로 두었다 . • AddRef/Release 는 Thread-Safe 하게 동작한다 . CGCIICho sanghyun’s Game Classes II 참조계수 (ReferenceCount)?참조계수
  • 3. class ICGReferenceCount { protected: ICGReferenceCount() {} virtual ~ICGReferenceCount() {} public: long AddRef() { return m_Counter.increment();} long Release(); protected: virtual void OnFinalRelease() PURE; private: Interlocked_long m_Counter; }; class ICGReferenceCount { protected: ICGReferenceCount() {} virtual ~ICGReferenceCount() {} public: long AddRef() { return m_Counter.increment();} long Release(); protected: virtual void OnFinalRelease() PURE; private: Interlocked_long m_Counter; }; long ICGReferenceCount::Release() { long result=m_Counter.decrement(); if(result==0) OnFinalRelease(); return result; } long ICGReferenceCount::Release() { long result=m_Counter.decrement(); if(result==0) OnFinalRelease(); return result; } 1. 참조계수를 위한 변수 (Interlocked 로 동작하며 0 으로 초기화 ) 2. 참조계수 증가 AddRef() 참조계수 감소 Release() 3. 참조계수 감소 Release() 로 참조 계수가 0 이 되면 OnFinalRelease() 함수 호출 ! 4. OnFinalRelease() 함수는 순수가상 함수로 정의 !  ICGReferenceCount 는 기본적으로 IUnknown 와 유사하다 . CGCIICho sanghyun’s Game Classes II ICGReferenceCount (1)참조계수
  • 4.  참조계수를 적용한 동적 객체를 위해서 ICGReferenceCount 는 상속해서 사용함 .  순수가상함수인 OnFinalRelease() 함수를 재정의하여 사용함 . class foo: virtual public ICGReferenceCount { public: foo() {} virtual ~ foo() {} … protected: virtual void OnFinalRelease() { delete this; } … }; class foo: virtual public ICGReferenceCount { public: foo() {} virtual ~ foo() {} … protected: virtual void OnFinalRelease() { delete this; } … }; 1. ICGReferenceCount 를 상속 (virtual public 으로 ) 2. OnFinalRelease() 함수의 재정의 ! ( 일반적으로 자기자신을 지우도록 정의 ) { foo* pObject = new foo; pObject->AddRef(); … pObject->Release(); } { foo* pObject = new foo; pObject->AddRef(); … pObject->Release(); } 5. 참조계수 증가시키기 ! ( 이때 참조계수는 1) 4. 생성 ! ( 이때 참조계수는 0) 6. 참조계수 감소시키기 ! ( 이때 참조계수는 0 이 되며 OnFinalRelease() 가 호출 ) CGCIICho sanghyun’s Game Classes II ICGReferenceCount (2)참조계수
  • 5.  일일이 수동으로 참조계수를 증가 / 감소 시키는 것은 완전히 시르고 귀찮다 !!!  그래서 CGPTR<T>(CGD::shared_object<T>) 클래스가 있다 ! template <typename TREF> class CGPTR { public: CGPTR() : m_ref(nullptr) {} CGPTR(TREF* _ref) : m_ref(_ref) { if(_ref!=nullptr) _ref->AddRef();} CGPTR(const CGPTR <TREF>& _ref) : m_ref(_ref.get()) { if(m_ref!=nullptr) m_ref->AddRef();} ~ CGPTR() { if(m_ref!=nullptr) m_ref->Release();} public: CGPTR<TREF>& operator=(TREF* _rhs) { _reset(_rhs); return (*this);} CGPTR<TREF>& operator=(const CGPTR<TREF>& _rhs){ _reset(_rhs.get()); return (*this);} … protected: TREF* m_ref; void _reset() { if(m_ref==nullptr) return; m_ref->Release(); m_ref=nullptr; } void _reset(TREF* _ref) // _ref 를 AddRef() 하고 m_ref 를 Release() 한다 . … }; template <typename TREF> class CGPTR { public: CGPTR() : m_ref(nullptr) {} CGPTR(TREF* _ref) : m_ref(_ref) { if(_ref!=nullptr) _ref->AddRef();} CGPTR(const CGPTR <TREF>& _ref) : m_ref(_ref.get()) { if(m_ref!=nullptr) m_ref->AddRef();} ~ CGPTR() { if(m_ref!=nullptr) m_ref->Release();} public: CGPTR<TREF>& operator=(TREF* _rhs) { _reset(_rhs); return (*this);} CGPTR<TREF>& operator=(const CGPTR<TREF>& _rhs){ _reset(_rhs.get()); return (*this);} … protected: TREF* m_ref; void _reset() { if(m_ref==nullptr) return; m_ref->Release(); m_ref=nullptr; } void _reset(TREF* _ref) // _ref 를 AddRef() 하고 m_ref 를 Release() 한다 . … }; CGCIICho sanghyun’s Game Classes II CGPTR (1)참조계수
  • 6.  일일이 AddRef()/Release() 대신 CGPTR<T> 를 쓰면 아래처럼 쓸 수 있다 . { foo* pObject = new foo; pObject->AddRef(); … pObject->Release(); } { foo* pObject = new foo; pObject->AddRef(); … pObject->Release(); } { CGPTR<foo> pObject = new foo; … } { CGPTR<foo> pObject = new foo; … } CGCIICho sanghyun’s Game Classes II CGPTR<T> (2)참조계수
  • 7. ICGReferenceCount Releaser  매번 OnFinalRelease() 함수를 재정의하는 것도 귀찮으다 ! class foo: virtual public ICGReferenceCount { … protected: virtual void OnFinalRelease() { delete this; } }; class foo: virtual public ICGReferenceCount { … protected: virtual void OnFinalRelease() { delete this; } }; 너무 뻔하다 !!! namespace CGReleaser { class NDelete: virtual public ICGReferenceCount { public: virtual ~ NDelete() {} protected: virtual void OnFinalRelease() { delete this; } … }; } namespace CGReleaser { class NDelete: virtual public ICGReferenceCount { public: virtual ~ NDelete() {} protected: virtual void OnFinalRelease() { delete this; } … }; } 아무것도 없고 !! 이것만 달랑 ~  Releaser 를 만들어 다중 상속하여 사용한다 . class foo: public CGReleaser::NDelete { … }; class foo: public CGReleaser::NDelete { … }; Releaser 를 상속받는 것만으로 끝 !!!  그래서… CGCIICho sanghyun’s Game Classes II Release참조계수
  • 8.  Releaser 를 상속받는 것도 귀찮으다 !! 그리고 상황에 따라 Releaser 가 변경될 수도 있다 !!!  그래서 NEW<T> 를 제공한다 !!! class foo: virtual public ICGReferenceCount { … }; class foo: virtual public ICGReferenceCount { … }; 단지 ICGReferenceCount 만 virtual public 으로 상속받아서… template <typename T> CGPTR<T> NEW() { class TCREATE : public T, public CGReleaser::Ndelete { }; return new TCREATE(); }; template <typename T> CGPTR<T> NEW() { class TCREATE : public T, public CGReleaser::Ndelete { }; return new TCREATE(); }; Nested class TCREATE T 와 Releaser 를 다중상속 받는다 !!! TCREATE 를 생성해 리턴 한다 !  NEW<T> 를 사용하면 Releaser 를 상속받거나 OnFinalRelease() 함수를 재정의하지 않고 그냥 ICGReferenceCount 만 상속받으면 된다 !!!! { CGPTR<foo> pObject = NEW<foo>(); } { CGPTR<foo> pObject = NEW<foo>(); }  자동으로 Releaser 를 붙여주기 때문에 NEW<T> 를 사용하면 생성 가능하다 !!! CGCIICho sanghyun’s Game Classes II NEW<T> 함수 (1)참조계수
  • 9.  그래서 앞으로 CGCII 의 일반적으로 동적 생성이 되는 객체는 ICGReferenceCount 만 상속받으며 .. class foo: virtual public ICGReferenceCount { … }; class foo: virtual public ICGReferenceCount { … }; CGPTR<foo> pObject = NEW<foo>();CGPTR<foo> pObject = NEW<foo>();  NEW<T> 함수를 사용하여 생성하고…  생성된 포인터는 CGPTR<T> 에 저장하여 보관한다 .  아니 그럼 !!! 어차피 거의 다 OnFinalRelease() 에 ‘ delete this’ 할 것이면 뭣 하러 가상함수로 만들었 나 ??? → 왜 필요한 가는 Pool 을 한 후 설명 !! CGCIICho sanghyun’s Game Classes II NEW<T> 함수 (2)참조계수
  • 10. CGCIICho sanghyun’s Game Classes II 질문 ?참조계수 중간 질문 ?

Editor's Notes

  • #4: Reference Counter란?? Smart pointer과 동일한 기능을 수행한다. 다만 객체 자체에 참조계수를 수행하는 ICGReferenceCount 클래스를 상속받아 shared_ptr처럼 참조계수를 위한 메모리를 생성하지 않는다.
  • #5: ICGReferenceCount 클래스는 자체 Reference Count를 위한 Thread-safe한 변수를 가지고 있고 AddRef와 Release 함수를 가지고 있다. Release함수를 호출하여 Ref Count가 0이 되면 가상함수인 OnFinalRelease()함수를 호출한다. 사용자는 이 ICGReferenceCount를 상속받아 반드시 OnFinalRelease()함수를 정의해 주어야 한다.+ 이때 virtual public으로 상속받아야 한다!!!!
  • #6: 생성 후 수동으로 AddRef()함수와 Release()함수를 호출하여 참조계수를 설정할 수 있지만… 한계가 있다. 그래서 자동화를 위한 CGPTR&amp;lt;T&amp;gt;를 제공해준다.
  • #7: CGPTR&amp;lt;T&amp;gt;는 마치 CComPtr&amp;lt;T&amp;gt;와 거의 동일한 클래스로.. ICGReferenceCount를 상속받은 객체의 포인터를 넣으면 AddRef()가 호출되어 참조계수를 1증가시키고 다시 빼거나 혹은 CGPTR&amp;lt;T&amp;gt; 객체가 소멸되면 Release()함수를 호출하여 참조계수를 1 감소시킨다.
  • #8: CGPTR&amp;lt;T&amp;gt;는 마치 CComPtr&amp;lt;T&amp;gt;와 거의 동일한 클래스로.. ICGReferenceCount를 상속받은 객체의 포인터를 넣으면 AddRef()가 호출되어 참조계수를 1증가시키고 다시 빼거나 혹은 CGPTR&amp;lt;T&amp;gt; 객체가 소멸되면 Release()함수를 호출하여 참조계수를 1 감소시킨다.
  • #9: 생성시킨 객체마다 ICGReferenceCount의 OnFinalRelease()함수를 작성하기는 귀찮다. 그래서 Releaser를 만들어 그냥 상속만 받으면 동작하도록 한다.
  • #10: 상속받는 것도 귀찮다!! 매번 상속받는 것이 귀찮으므로 NEW&amp;lt;T&amp;gt; 클래스를 정의했다. (이부분은 일종의 Meta Programming임.) Releaser를 상속받지 않아도 자동적으로 Releaser부분을 정의해준다.
  • #11: 상속받는 것도 귀찮다!! 매번 상속받는 것이 귀찮으므로 NEW&amp;lt;T&amp;gt; 클래스를 정의했다. (이부분은 일종의 Meta Programming임.) Releaser를 상속받지 않아도 자동적으로 Releaser부분을 정의해준다.