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_); }