Windows Vista及更新的Windows客户端系统,Windows Server 2008及更新的Windows服务器系统,新增了读写锁API函数,我们不用再手动编写读写锁了。
要使用读写锁,当然要包含Windows头文件,并定义一个SRWLOCK(结构体)类型的变量:
SRWLOCK Lock;
SRWLOCK类型的变量,不能手动赋值,不能取其中字段的值,也不能用memcpy等函数拷贝它所占的内存,对它的所有操作(初始化、读锁、写锁等等)只能通过相关的函数来进行。
初始化读写锁的函数是InitializeSRWLock,用法是:
InitializeSRWLock(&Lock);
参数类型为SRWLOCK*,把刚才定义的Lock的地址传递过去就可以了。
为读操作上锁的函数是AcquireSRWLockShared:
AcquireSRWLockShared(&Lock;
为读操作解锁的函数是ReleaseSRWLockShared:
ReleaseSRWLockShared(&Lock)
为写操作上锁的函数是AcquireSRWLockExclusive:
AcquireSRWLockExclusive(&Lock);
为写操作上锁的函数是ReleaseSRWLockExclusive:
ReleaseSRWLockExclusive(&Lock);
读写锁不需要手动删除。
为了方便,我一般会把读写锁及其相关的函数封装成一个类,从而达到“开箱即用”的效果。
// 头文件 srw.h
// 需要:
//#include <windows.h>
class RWMutex
{
public:
RWMutex();
~RWMutex() = default;
void RLock();
void RUnlock();
void Lock();
void Unlock();
private:
SRWLOCK Lock_;
private:
RWMutex(const RWMutex&) = delete;
void operator=(const RWMutex&) = delete;
};
重载赋值符号,返回void而不是RWMutex&,这其实更加合理。
// 源文件 srw.cpp
RWMutex::RWMutex()
{
::InitializeSRWLock(&Lock_);
}
void RWMutex::RLock()
{
::AcquireSRWLockShared(&Lock_);
}
void RWMutex::RUnlock()
{
::ReleaseSRWLockShared(&Lock_);
}
void RWMutex::Lock()
{
::AcquireSRWLockExclusive(&Lock_);
}
void RWMutex::Unlock()
{
::ReleaseSRWLockExclusive(&Lock_);
}