c++ shared_mutex 读写锁使用详解

c++ 读写锁使用详解

std::shared_mutex c++17

  • 头文件 #include <shared_mutex>
  • 用于实现共享和独占访问的互斥锁。
  • 提供了一种更加灵活的机制,允许多个线程在共享模式下读取数据,但只允许单个线程在独占模式下写入或修改数据。
  • 与 std::mutex 相比,具有以下额外特性:
    • 多个线程可以同时以共享模式(shared mode)持有锁,允许并发读取操作。
    • 只有一个线程可以以独占模式(exclusive mode)持有锁,允许写入或修改操作。
    • 当一个线程以独占模式持有锁时,其他线程无法以共享模式持有锁,它们必须等待独占模式的线程释放锁。
    • 当一个线程以共享模式持有锁时,其他线程可以以共享模式持有锁,允许并发读取操作。

成员函数

  • lock:锁定互斥,若互斥不可用则阻塞。
  • try_lock:尝试锁定互斥,若互斥不可用则返回。
  • unlock:解锁互斥。
  • lock_shared:以共享模式锁定互斥,若互斥不可用则阻塞。
  • try_lock_shared:尝试以共享模式锁定互斥,若互斥不可用则返回。
  • unlock_shared:解锁以共享模式锁定的互斥。

推荐使用方法

  • 当使用共享模式时,配合 std::shared_lock 使用。
  • 当使用独占模式时,配合 std::lock_guard,std::unique_lock 或者 std::scoped_lock 使用。

示例代码

  • 以下示例演示了两个读取线程(reader)以共享模式持有 mutex,并同时读取 shared_data 的值。写入线程(writer)以独占模式持有 mutex,并将 shared_data 的值加一。读取线程可以同时持有锁,而写入线程需要等待读取线程释放锁。

    #include <cstdio>
    #include <thread>
    #include <mutex>
    #include <shared_mutex>
    
    std::shared_mutex mutex;
    int shared_data = 0;
    
    void reader()
    {
        std::shared_lock lock(mutex);
        printf("reader: shared data value is %d\n", shared_data);
    }
    
    void writer()
    {
        std::lock_guard lock(mutex);
        shared_data += 1;
        printf("writer: incremented shared data value to %d\n", shared_data);
    }
    
    int main()
    {
        std::jthread t1(reader);
        std::jthread t2(writer);
        std::jthread t3(reader);
        return 0;
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注的罗哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值