Windows Vista新增的讀寫鎖函數

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_);
}
相關文章
相關標籤/搜索