1 class IMyLock
2 {
3 public:
4 virtual ~IMyLock(){}
5
6 virtual void Lock() const = 0;
7 virtual void UnLock() const = 0;
8 };
9
10 class Mutex : public IMyLock
11 {
12 public:
13 Mutex();
14 ~Mutex();
15
16 virtual void Lock() const;
17 virtual void UnLock() const;
18 private:
19 HANDLE Mutex_;
20 };
21
22 Mutex::Mutex(){
23 Mutex_ = ::CreateMutex(NULL, false, NULL);
24 }
25
26 void Mutex::Lock() const
27 {
28 WaitForSingleObject(Mutex_, INFINITE);
29 }
30
31 void Mutex::UnLock() const
32 {
33 ::ReleaseMutex(Mutex_);
34 }
35
36 class CLock{
37 public:
38 CLock(const IMyLock&);
39 ~CLock();
40
41 private:
42 const IMyLock& myLock_; //纯虚类可以这样声明对象
43 };
44
45 CLock::CLock(const IMyLock& lock) :myLock_(lock)
46 {
47 myLock_.Lock();
48 }
49 CLock::~CLock(){
50 myLock_.UnLock();
51 }