Boost.shared_mutex写优先,读共享,交叉互斥

Boost.shared_mutex 是一种读写锁,遵循写优先、读共享和交叉互斥原则。在写锁状态下,所有线程会被阻塞;读锁状态下,多个读线程可并行访问,但写线程会被阻塞。Boost 的 shared_mutex 实现默认是写者优先,确保数据新鲜度。通过一个包含两个读者和两个写者线程的示例,展示了 shared_mutex 如何工作:读者可并发访问,而写者独占资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比较频繁,而写操作比较少的情况。

    读写锁比起mutex具有更高的适用性,具有更高的并行性,可以有多个线程同时占用读模式的读写锁,但是只能有一个线程占用写模式的读写锁,读写锁的基本规则可以总结为<写优先,读共享,交叉互斥>,具体表现为读写锁的三种状态:
        (1)当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。(交叉互斥)
        (2)当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式对它进行加锁的线程将会被阻塞。(读共享,交叉互斥)
        (3)当读写锁在读模式的锁状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁的请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求则长期阻塞。(写优先)

注:其实在读者-写者问题中,有读者优先和写者优先两种模式,只是在boost中的shared_mutex默认的实现是写者优先,这其实也是有道理的,因为在我们总是希望读到的数据是最新的,这就得保证写者优先。

    下面通过一个 boost::shared_mutex的应用实例来反应其锁机制,该例子中我们建立两个读者线程,两个写者线程,程序的实际运行结果很直接的反应了shared_mutex应用情况。

    #include <boost\ref.hpp>  
    #include <boost\thread\thread.hpp>  
    #include <string>  
    using namespace boost;  
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值