单位内部人员写的,可以借鉴与使用。
windows平台
lock.h
#ifndef Lock_H_
#define Lock_H_
#include <windows.h>
//锁接口类
class IMyLock
{
public:
virtual ~IMyLock() {}
virtual void Lock(){};
virtual void Unlock(){};
};
//互斥对象锁类
class CMutexLock : public IMyLock
{
public:
CMutexLock();
~CMutexLock();
virtual void Lock();
virtual void Unlock();
private:
HANDLE m_mutex;
};
//临界区锁类
class CCriticalSectionLock : public IMyLock
{
public:
CCriticalSectionLock();
~CCriticalSectionLock();
virtual void Lock();
virtual void Unlock();
private:
CRITICAL_SECTION m_cs;
};
//锁
class CLock
{
public:
CLock(IMyLock&);
~CLock();
private:
IMyLock& m_lock;
};
#endif
lock.cpp
#include "Lock.h"
//创建一个匿名互斥对象
CMutexLock::CMutexLock()
{
m_mutex = ::CreateMutex(NULL, FALSE, NULL);
}
//销毁互斥对象,释放资源
CMutexLock::~CMutexLock()
{
::CloseHandle(m_mutex);
}
//确保拥有互斥对象的线程对被保护资源的独自访问
void CMutexLock::Lock()
{
DWORD d = WaitForSingleObject(m_mutex, INFINITE);
}
//释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问
void CMutexLock::Unlock()
{
::ReleaseMutex(m_mutex);
}
//创建临界区对象
CCriticalSectionLock::CCriticalSectionLock()
{
InitializeCriticalSection(&m_cs);
}
//销毁临界区对象,释放资源
CCriticalSectionLock::~CCriticalSectionLock()
{
DeleteCriticalSection(&m_cs);
}
//确保拥有临界区对象的线程对被保护资源的独自访问
void CCriticalSectionLock::Lock()
{
EnterCriticalSection(&m_cs);
}
//释放当前线程拥有的临界区对象,以使其它线程可以拥有临界区对象,对被保护资源进行访问
void CCriticalSectionLock::Unlock()
{
LeaveCriticalSection(&m_cs);
}
//利用C++特性,进行自动加锁
CLock::CLock(IMyLock& m) : m_lock(m)
{
m_lock.Lock();
}
//利用C++特性,进行自动解锁
CLock::~CLock()
{
m_lock.Unlock();
}