温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++的std::shared_mutex读写锁怎么使用

发布时间:2022-03-15 16:52:57 来源:亿速云 阅读:564 作者:iii 栏目:开发技术

这篇“C++的std::shared_mutex读写锁怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的std::shared_mutex读写锁怎么使用”文章吧。

0.前言

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

  • 共享:多个线程能共享同一互斥的所有权(如配合shared_lock);

  • 独占:仅有一个线程能占有互斥(如配合lock_guard、unique_lock)。

shared_mutex 通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。

1.认识std::shared_mutex

通过查看该类的接口,可以看到,该类除了互斥锁定接口,还提供了共享锁定接口。

C++的std::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 <iostream>
//std::unique_lock
#include <mutex> 
#include <shared_mutex>
#include <thread>
 
class ThreadSafeCounter {
public:
    ThreadSafeCounter() = default;
 
    // 多个线程/读者能同时读计数器的值。
    unsigned int get() const {
        std::shared_lock<std::shared_mutex> lock(mutex_);
        return value_;
    }
 
    // 只有一个线程/写者能增加/写线程的值。
    void increment() {
        std::unique_lock<std::shared_mutex> lock(mutex_);
        value_++;
    }
 
    // 只有一个线程/写者能重置/写线程的值。
    void reset() {
        std::unique_lock<std::shared_mutex> 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读写锁怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI