标签:
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_); }
标签:
原文地址:http://my.oschina.net/jthmath/blog/395127