最近做一个项目,存在多个进程或线程同时操作Sqlite,为了防止数据库读写失败,用互斥量来实现Lock单一独占数据库资源。Lock类源代码如下:
#ifndef _Lock_H
#define _Lock_H
#include <windows.h>
//互斥对象锁类
class Mutex
{
public:
//创建一个匿名互斥对象
Mutex()
{
m_mutex = ::CreateMutex(NULL, FALSE, "Global\\LdDecryptDbMutex");
}
//销毁互斥对象,释放资源
<span style="white-space:pre"> </span>~Mutex()
{
<span style="white-space:pre"> </span>::CloseHandle(m_mutex);
}
//确保拥有互斥对象的线程对被保护资源的独自访问
void Lock() const
{
DWORD d = WaitForSingleObject(m_mutex, INFINITE);
}
//释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问
void Unlock() const
{
::ReleaseMutex(m_mutex);
}
private:
HANDLE m_mutex;
};
//锁
class CLock
{
//利用C++特性,进行自动加锁
CLock(const Mutex& m) : m_lock(m)
{
m_lock.Lock();
}
//利用C++特性,进行自动解锁
~CLock()
{
m_lock.Unlock();
}
private:
const Mutex& m_lock;
};
#endif
Mutex* pDbMutex = new Mutex; // 构造函数会进行全局互斥量的创建,CreateMutex第二个参数为False:这个互斥量不被任何创建其线程拥有,递归计数器被设置为0,发出通知信号
pDbMutex->Lock(); // Wait到Mutex有信号,将递归计数器设置为1不发出通知信号,其他等待该互斥量的线程无限等待信号
...
pDbMutex->Unlock(); // 释放该互斥量,递归计数器设置为0发出通知信号
delete pDbMutex; // 记得资源的销毁并指针置为NULL
pDbMutex = NULL;