C++|C++ std::shared_mutex读写锁的使用
目录
- 0.前言
- 1.认识std::shared_mutex
- 2.实例演示
0.前言 读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex类(在这之前,可以使用boost的shared_mutex类或系统相关api)。和其他便于独占访问的互斥类型不同,shared_mutex 拥有两个访问级别:
- 共享:多个线程能共享同一互斥的所有权(如配合shared_lock);
- 独占:仅有一个线程能占有互斥(如配合lock_guard、unique_lock)。
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//std::unique_lock#include #include #include class ThreadSafeCounter {public:ThreadSafeCounter() = default; // 多个线程/读者能同时读计数器的值。unsigned int get() const {std::shared_lock lock(mutex_); return value_; } // 只有一个线程/写者能增加/写线程的值。void increment() {std::unique_lock lock(mutex_); value_++; } // 只有一个线程/写者能重置/写线程的值。void reset() {std::unique_lock 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读写锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- C++|蓝桥杯算法提高欧拉函数--复杂度为O(n log n)
- devc++屏幕换颜色代码
- 《C++要笑着学》|【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针
- C++(类的成员函数定义方式)
- c++|c++类的默认成员函数
- C++|C++ 网络套接字编程TCP和UDP实例
- C++|网络套接字编程
- 分治法之棋盘覆盖复牌问题,c++实现
- C++实现图书管理系统课程设计(面向对象)
- C++实现图书管理系统简易版