共享锁和排它锁—C++17 多线程

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

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

shared_mutex适用于多线程同时读取是不发生竞争,写入时发出竞争

#include <iostream>
#include <thread>
#include <map>
#include <mutex>
#include <shared_mutex>using namespace std;class DnsEntry
{private:std::string ip;
public:DnsEntry(){}DnsEntry(std::string _ip): ip(_ip){}
};class DnsCatch
{private:std::map<std::string, DnsEntry> entries;mutable std::shared_mutex entry_mutex;
public:// 多个线程可以同时调用DnsEntry find_entry(std::string const& domain) const{std::shared_lock<std::shared_mutex> lk(entry_mutex);std::cout << "读取\n";std::map<std::string, DnsEntry>::const_iterator const it = entries.find(domain);return (it == entries.end()) ? DnsEntry() : it->second;}// 只有一个线程可以调用void update_or_add_entry(std::string const& domain, DnsEntry const& dns_details){std::unique_lock<std::shared_mutex> lk(entry_mutex);std::cout << "更新\n";entries[domain] = dns_details;}
};

参考《C++并发编程实战(第2版)

共享锁和排它锁---C++17 多线程相关推荐

  1. java共享锁排它锁_java 实现共享锁和排它锁

    标签: 一直对多线程有恐惧,在实现共享锁和排它锁之后,感觉好了很多. 共享锁    就是查询的时候,如果没有修改,可以支持多线程查询: 排它锁    就是修改的时候,锁定共享锁,停止查询,同时,锁定排 ...

  2. innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁

    mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使 ...

  3. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  4. C# 乐观锁、悲观锁、共享锁、排它锁、互斥锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

  5. 共享锁和排它锁的用法

    共享锁和排它锁 排它锁,又称为独占锁.独享锁 共享锁,又称为读锁,获得共享锁之后,可以查看但无法修改和删除数据,其他线程此时也可以获取到共享锁,也可以查看,但无法修改和删除数据 共享锁和排它锁的典型是 ...

  6. Oracle 共享锁和排它锁、 DML和DDL锁、 for update 锁表的问题

    共享锁和排它锁 oracle有两种模式的锁:排他锁(exclusive lock,即X锁)和共享锁(share lock,即S锁). 共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享 ...

  7. std::future ---C++17 多线程

    std::future -C++17 多线程 std::future C++标准程序库使用future来模拟这类一次性事件:若线程需等待某个特定的一次性事件发生,则会以恰当的方式取得一个future, ...

  8. 条件变量 ---C++17 多线程

    条件变量 -C++17 多线程 C++标准库提供了条件变量的两种实现:std::condition_variable 和std::condition_variable_any.它们都在标准库的头文件& ...

  9. 共享锁与排它锁区别(转)

    共享锁[S锁] 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁.这保证了其他事务可以读A,但在T释放A上的S锁之前不 ...

最新文章

  1. maven 添加数据库驱动
  2. JSONP的实现原理
  3. BugkuCTF-Misc:啊哒~
  4. 绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器。
  5. 常规对数据库库的操作
  6. 7-8 评委打分 (5 分)
  7. 邮件服务器向hotmail等邮箱发信收到退信的解决方法
  8. 添加Copy To和Move To 到系统右键菜单中(Vista 也适用)
  9. 使用Dosbox运行程序
  10. python中实现简单抽样的函数
  11. cas27647-84-3四羧基苯基卟啉锌;四羧基苯基锌卟啉TCPP-Zn(2+)/分子量:850.116160000001
  12. 快快网络融合CDN是什么
  13. Yagmail通过QQ邮箱发送邮件实例
  14. 启动springboot报错:程序包org.springframework.boot不存在
  15. 断舍离------活成自己喜欢的样子
  16. 型号不同的计算机内存条可以通用么,不同频率的内存条可以混用吗
  17. swift和swiftui_SwiftUI和UIStackflow问题
  18. win10笔记本相机打开黑屏无法打开笔记本相机
  19. 嵌入式培训多少钱?嵌入式学习要了解这些内容!
  20. 报错:SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>)

热门文章

  1. 注释工具_苹果已购丨Notability丨功能强大而简单易用的笔记及PDF注释工具
  2. python 会增加内存吗,Python+不断增加的内存分配
  3. ducker桌面版更改安装位置_Ubuntu 16.04 安装 Docker和默认存储路径修改
  4. 熊仔科技Steamduino PIC18F46J50主控板 部分原理图
  5. Linux 下wifi 驱动开发(二)—— WiFi模块浅析
  6. C#控制台程序中处理2个关闭事件的代码实例
  7. Firefox无法启动,提示Profile is yet in use by another Firefox
  8. 共享内存---shmget shmat shmdt
  9. 前端学习(3315):UI提取
  10. 前端学习(3019):vue+element今日头条管理--自定义格式化面板