• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我是张洪铭我是熊博士
时光静好,与君同;细水长流,与君语
博客园    首页    新随笔    联系   管理    订阅  订阅

采用C++17新标准 “共享锁”和“独占锁”更低消耗更好性能地保护不常更新的共享数据

用到的标准库:

std::shared_lock<>、  std::shared_mutex、 std::lock_guard<>。 另外还有 std::shared_timed_mutex(此处不讲)。

 

分析:对于保护不常更新的共享数据, 因为写只是很偶然的发生,更频繁的是读取。如果不区分  “读者” 和 “作者” ,简单的使用 std::mutex, 会有很多消耗的浪费。 例如,DNS域名解析服务, 当没有新的设备接入时,入口表可能一个星期检查,并细微的更新一次。 这种情况就非常适合我们即将讲到的情况。

 

C++17 提供的 “共享锁” 和 “独占锁” 机制, 当多个读者到来时,它们可同时获取共享锁进行读取; 当某个写着到来时, 先获取共享锁,然后等待当前已存在的读者读取结束, 之后进一步获取独占锁进行写入。要注意的是, 在写着 “等待” 当前读者读取结束这个环节,另外的读取或者写入将不能获取共享锁, 直到当前的写着结束写之后,其它的写着,或者读者,才能进行锁的获取。

有几个要注意的点:

1. C++17标准

2. 对于读者获取共享锁的方式:

  std::shared_lock<std::shared_mutex>  shlk( mtx);

3. 对于写着获取独占锁的方式:

      std::lock_guard<std::shared_mutex> lkgd( mtx );

 

posted @ 2022-01-17 14:39  我是张洪铭我是熊博士  阅读(534)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3