C++ std::shared_mutex读写锁的使用

 更新时间:2022年03月15日 14:31:51   作者:龚建波  
本文主要介绍了C++ std::shared_mutex读写锁的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

0.前言

读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex类(在这之前,可以使用boost的shared_mutex类或系统相关api)。和其他便于独占访问的互斥类型不同,shared_mutex 拥有两个访问级别:

  • 共享:多个线程能共享同一互斥的所有权(如配合shared_lock);
  • 独占:仅有一个线程能占有互斥(如配合lock_guard、unique_lock)。

shared_mutex 通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。

1.认识std::shared_mutex

通过查看该类的接口(https://zh.cppreference.com/w/cpp/thread/shared_mutex),可以看到,该类除了互斥锁定接口,还提供了共享锁定接口。

  • lock() 锁定互斥。若另一线程已锁定互斥,则到 lock() 的调用将阻塞执行,直至获得锁。可以用 std::lock_guard 和 std::unique_lock 管理互斥锁定。
  • shared_lock() 获得互斥的共享所有权。若另一线程以排他性所有权保有互斥,则到 shared_lock() 的调用将阻塞执行,直到能取得共享所有权。若已以任何模式(排他性或共享)占有 mutex 的线程调用 shared_lock() ,则行为未定义。若多于实现定义最大数量的共享所有者已以共享模式锁定互斥,则 shared_lock() 阻塞执行,直至共享所有者的数量减少。所有者的最大数量保证至少为 10000 。可以用std::shared_lock管理共享锁定。

2.实例演示

这里直接借用在线手册上的例子:

#include <iostream>
//std::unique_lock
#include <mutex> 
#include <shared_mutex>
#include <thread>
 
class ThreadSafeCounter {
public:
    ThreadSafeCounter() = default;
 
    // 多个线程/读者能同时读计数器的值。
    unsigned int get() const {
        std::shared_lock<std::shared_mutex> lock(mutex_);
        return value_;
    }
 
    // 只有一个线程/写者能增加/写线程的值。
    void increment() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        value_++;
    }
 
    // 只有一个线程/写者能重置/写线程的值。
    void reset() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        value_ = 0;
    }
 
private:
    mutable std::shared_mutex mutex_;
    unsigned int value_ = 0;
};
 
int main() {
    ThreadSafeCounter counter;
 
    auto increment_and_print = [&counter]() {
        for (int i = 0; i < 3; i++) {
            counter.increment();
            std::cout << std::this_thread::get_id() << '\t' << counter.get() << std::endl;
        }
    };
 
    std::thread thread1(increment_and_print);
    std::thread thread2(increment_and_print);
 
    thread1.join();
    thread2.join();
 
    system("pause");
    return 0;
}

到此这篇关于C++ std::shared_mutex读写锁的使用的文章就介绍到这了,更多相关C++ std::shared_mutex读写锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT中在QLabel显示图片并且利用鼠标点击画线问题

    QT中在QLabel显示图片并且利用鼠标点击画线问题

    这篇文章主要介绍了QT中在QLabel显示图片并且利用鼠标点击画线问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++中的各种容器的使用方法汇总

    C++中的各种容器的使用方法汇总

    这篇文章主要介绍了C++中的各种容器的使用方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • C 语言实现一个简单的 web 服务器的原理解析

    C 语言实现一个简单的 web 服务器的原理解析

    这篇文章主要介绍了C 语言实现一个简单的 web 服务器的原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C++集体数据交换实现示例讲解

    C++集体数据交换实现示例讲解

    这篇文章主要介绍了C++集体数据交换实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • Win10中VC2013安装Unit test组件出现问题解决方案

    Win10中VC2013安装Unit test组件出现问题解决方案

    本文给大家分享的是个人在Win10中VC2013安装Unit test组件出现问题并最终找到解决办法的过程,有需要的小伙伴可以参考下
    2016-03-03
  • C++ Boost Assign超详细讲解

    C++ Boost Assign超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12
  • 深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现LeetCode(77.Combinations 组合项)

    C++实现LeetCode(77.Combinations 组合项)

    这篇文章主要介绍了C++实现LeetCode(Combinations 组合项),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Qt向ini文件写入中文出现乱码问题的解决方法详解

    Qt向ini文件写入中文出现乱码问题的解决方法详解

    这篇文章主要为大家详细介绍了当Qt向ini文件写入中文出现乱码问题时的解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 使用C语言操作树莓派GPIO的详细步骤

    使用C语言操作树莓派GPIO的详细步骤

    今天抽空给大家普及使用C语言操作树莓派GPIO的详细步骤,本文大概分五步给大家介绍树莓派GPIO安装步骤,首先需要安装GPIO库然后进行一步步设置,具体操作方法跟随小编一起学习吧
    2021-06-06

最新评论