Windows Vista及更新的Windows客户端系统,Windows Server 2008及更新的Windows服务器系统,新增了读写锁API函数,咱们不用再手动编写读写锁了。windows
要使用读写锁,固然要包含Windows头文件,并定义一个SRWLOCK(结构体)类型的变量:服务器
SRWLOCK Lock;
SRWLOCK类型的变量,不能手动赋值,不能取其中字段的值,也不能用memcpy等函数拷贝它所占的内存,对它的全部操做(初始化、读锁、写锁等等)只能经过相关的函数来进行。函数
初始化读写锁的函数是InitializeSRWLock,用法是:ui
InitializeSRWLock(&Lock);
参数类型为SRWLOCK*,把刚才定义的Lock的地址传递过去就能够了。spa
为读操做上锁的函数是AcquireSRWLockShared:code
AcquireSRWLockShared(&Lock;
为读操做解锁的函数是ReleaseSRWLockShared:内存
ReleaseSRWLockShared(&Lock)
为写操做上锁的函数是AcquireSRWLockExclusive:it
AcquireSRWLockExclusive(&Lock);
为写操做上锁的函数是ReleaseSRWLockExclusive:
class
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_); }