您的位置:首页 > 其它

利用策略模式实现的线程同步

2015-03-31 21:25 330 查看
利用策略模式实现的线程同步

代码

头文件

#ifndef __MUTEX_DEMO__
#define __MUTEX_DEMO__

#include <windows.h>

//锁接口类
class ILock {
public:
virtual ~ILock(){}
virtual void Lock()   = 0;
virtual void Unlock()  = 0;
};

//互斥型的锁
class MutexLock:public ILock{
public:
MutexLock(){
m_mutex = ::CreateMutex(NULL,FALSE,NULL);
}
~MutexLock() {
::CloseHandle(m_mutex);
}

virtual void Lock() ;
virtual void Unlock() ;
private:
HANDLE m_mutex;
};

//临界区的锁
class CriticalLock:public ILock{
public:
CriticalLock(){
::InitializeCriticalSection(&m_critical);
}
~CriticalLock() {
::DeleteCriticalSection(&m_critical);
}

virtual void Lock()  ;
virtual void Unlock() ;
private:
CRITICAL_SECTION m_critical;
};

//同步
class Synchronize {
public:
Synchronize( ILock& m):m_lock(m){
m_lock.Lock();
}
~Synchronize(){
m_lock.Unlock();
}

private:
ILock& m_lock;
};

#endif


cpp文件

#include "Mutex_Demo.h"

void MutexLock::Lock()  {
DWORD d = WaitForSingleObject(m_mutex,INFINITE);
}

void MutexLock::Unlock()  {
::ReleaseMutex(m_mutex);
}

void CriticalLock::Lock()  {
EnterCriticalSection(&(m_critical));
}

void CriticalLock::Unlock()  {
LeaveCriticalSection((&m_critical));
}


>

//使用方法 1:
MutexLock mutex;

void func() {
Synchronize synch(mutex);
{
//TODO:..
//这个函数退出时,会调用synch的析构函数
//对mutex解锁
}
}
int main() {

return 1;
}


//使用方法 2:
CriticalLock critical;

void func() {
Synchronize synch(critical);
{
//TODO:..
//这个函数退出时,会调用synch的析构函数
//对mutex解锁
}
}
int main() {

return 1;
}


局部变量Synchronize synch在函数走完后,会调用析构函数解锁。所以,所以对于想偷懒的人来说,这是一个好的实现方式

设计模式

上面的代码使用了策略模式,具体的UML图如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: