CresGuard 类主要的功能是线程访问同步,代码如下:
1 class CResGuard {
2 public:
3 CResGuard() { m_lGrdCnt = 0; InitializeCriticalSection(&m_cs); }
4 ~CResGuard() { DeleteCriticalSection(&m_cs); }
5
6 // IsGuarded is used for debugging
7 BOOL IsGuarded() const { return(m_lGrdCnt > 0); }
8
9 public:
10 class CGuard {
11 public:
12 CGuard(CResGuard& rg) : m_rg(rg) { m_rg.Guard(); };
13 ~CGuard() { m_rg.Unguard(); }
14
15 private:
16 CResGuard& m_rg;
17 };
18
19 private:
20 void Guard() { EnterCriticalSection(&m_cs); m_lGrdCnt++; }
21 void Unguard() { m_lGrdCnt--; LeaveCriticalSection(&m_cs); }
22
23 // Guard/Unguard can only be accessed by the nested CGuard class.
24 friend class CResGuard::CGuard;
25
26 private:
27 CRITICAL_SECTION m_cs;
28 long m_lGrdCnt; // # of EnterCriticalSection calls
29 };
问题四 实用方法
比如你有一个需要实现单件模式的类,就应该这样实现:
1 #include “singleton.h”
2 using namespace C2217::Pattern;
3
4 class ServiceManger
5 {
6 public:
7 void Run()
8 {
9 }
10 private:
11 ServiceManger(void)
12 {
13 }
14 virtual ~ServiceManger(void)
15 {
16 }
17 DECLARE_SINGLETON_CLASS(ServiceManger);
18 };
19
20 typedef Singleton<ServiceManger> SSManger;
在使用的时候很简单,跟一般的Singleton实现的方法没有什么不同.
1 int _tmain(int argc, _TCHAR* argv[])
2 {
3 SSManger::instance()->Run();
4 }
一个简单的Singleton模式的实现,可以看到C++(www.cppentry.com)语言背后隐藏的丰富的语意,我希望有人能实现一个更好的Singleton让大家学习.