Windows Vista新增的读写锁函数

本文介绍了Windows系统中新增的读写锁API函数,包括如何使用这些API进行读写锁的初始化、加锁和解锁操作。并通过一个封装好的类展示了读写锁的实际应用。

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

转载于:https://my.oschina.net/jthmath/blog/395127

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值