thread 동기화 관련하여 잘 이해가 가질 않네요.

gugudan의 이미지

class CCriticalSection
{
public:
	CCriticalSection(VOID)
	{
		InitializeCriticalSection(&mSync);
	}

	~CCriticalSection(VOID)
	{
		DeleteCriticalSection(&mSync);
	}

	inline VOID Enter(VOID)
	{
		EnterCriticalSection(&mSync);
	}

	inline VOID Leave(VOID)
	{
		LeaveCriticalSection(&mSync);
	}

private:
	CRITICAL_SECTION	mSync;
}





#pragma once

template <class T>
class CMultiThreadSync
{
friend class CThreadSync;
public:
	class CThreadSync
	{
	public:
		CThreadSync(VOID)
		{
			T::mSync.Enter();
		}

		~CThreadSync(VOID)
		{
			T::mSync.Leave();
		}
	};

private:
	static CCriticalSection mSync;
};

template <class T>
CCriticalSection CMultiThreadSync<T>::mSync;

2개의 클래스가 있습니다.
Online Game Server Program이라는 책에서 가져왔습니다.
잘 이해가 가지 않습니다.

CCriticalSection 이 클래스는 이해가 가는데
CMultiThreadSync 이 클래스는 이해가 가질 않네요.

왜 CMultiThreadSync 이 클래스 안에 CThreadSync 클래스를 만들었는데 CThreadSync 클래스 없이
그냥 하면 안되는건가요?
그리고 CCriticalSection에서 멤버변수로 잡은 mSync과
CMultiThreadSync에서 정적멤버변수로 잡은 mSync 이것도
잘 이해가 가질 않네요.
좀 자세히 설명좀 해주실수 없는지요?