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管理共享锁定。
这里直接借用在线手册上的例子:
#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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?