[modern c++] 使用shared_mutex , shared_lock完成读写锁,Need C++ 17

前言:

C++ 17开始,引入了两个新的同步组件, shared_mutex 和 shared_lock ,这两个组件的一个典型使用案例就是实现读写锁。

原语:

shared_mutex , 一个提供让多个线程都可以同时获取能力的mutex。

shared_mutx提供了两套接口

Exclusive locking

lock

locks the mutex, blocks if the mutex is not available
(public member function)

try_lock

tries to lock the mutex, returns if the mutex is not available
(public member function)

unlock

unlocks the mutex
(public member function)
Shared locking

lock_shared

locks the mutex for shared ownership, blocks if the mutex is not available
(public member function)

try_lock_shared

tries to lock the mutex for shared ownership, returns if the mutex is not available
(public member function)

unlock_shared

unlocks the mutex (shared ownership)
(public member function)

其中 exclusive locking 接口让 shared_mutex 的表现和 std::mutex 一模一样,只能被一个线程持有。

而shared locking 接口让 shared_mutex 可以被多个线程同时持有而不会阻塞任何一个线程。 

但是,如果任何一个线程使用了 exclusive locking接口进行加锁,那么其他使用 shared locking进行加锁的线程都会被阻塞。

shared_lock

读写锁的实现

了解了 shared_mutex 的特点以后,我们可以推出如下读写锁的常用写法:

std::shared_mutex sharedMtx;

void readResource(){
  //使用shared_lock确保使用 shared_mutex 的 shared locking 接口,进而实现shared加锁
  std::shared_lock<std::shared_mutex> lock(sharedMtx);   
  //read resource
}

void writeResource(){
  std::unique_lock<std::shared_mutex> lock(sharedMtx);
  //write resource
}

小结:

shared_mutex 的特别之处就是其提供了两套接口,一套是exclusive的,这让shared_mutex工作起来像std::mutex一样,另一套是shared的,这套接口让std::mutex工作在share模式下。

相关推荐

  1. C++

    2024-06-10 04:46:01       45 阅读
  2. 关于Redission

    2024-06-10 04:46:01       37 阅读
  3. 10 内核开发-避免冲突和死-

    2024-06-10 04:46:01       33 阅读
  4. 乐观、悲观、互斥

    2024-06-10 04:46:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 04:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 04:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 04:46:01       87 阅读
  4. Python语言-面向对象

    2024-06-10 04:46:01       96 阅读

热门阅读

  1. HTTP-一

    HTTP-一

    2024-06-10 04:46:01      29 阅读
  2. 洛谷 P2926:轻拍牛头 ← 模拟题

    2024-06-10 04:46:01       30 阅读
  3. 自然语言处理(NLP)—— 自动摘要

    2024-06-10 04:46:01       34 阅读
  4. 我已经入驻@面包多平台

    2024-06-10 04:46:01       32 阅读
  5. # Mac环境如何安装Flutter:全面指南

    2024-06-10 04:46:01       32 阅读
  6. 第壹章第12节 C#和TS语言对比-多态

    2024-06-10 04:46:01       31 阅读
  7. 数据处理之图像压缩

    2024-06-10 04:46:01       32 阅读
  8. DEJA_VU3D - Cesium功能集 之 121-底图机制

    2024-06-10 04:46:01       31 阅读
  9. shaderlab 关键点记录

    2024-06-10 04:46:01       29 阅读
  10. 深入剖析时序Prophet模型

    2024-06-10 04:46:01       31 阅读