基于多线程并发-STL之递归锁recursive_mutex

一:说明

1、recursive_mutex 类是同步原语,能用于保护共享数据免受从个多线程同时访问。
2、recursive_mutex 提供排他性递归所有权语义:
3、recursive_mutex 的使用场景之一是保护类中的共享状态,而类的成员函数可能相互调用

二:用法:

recursive_mutex的用处和mutex差不多,用于限制多线程同时访问同一个变量,用来加锁,保证多个线程,同一时刻只能有一个线程在修改变量;和mutex不同的时,recursive_mutex可以允许同一个线程递归的去加锁,线程只有加锁次数和释放次数相同时,才会释放变量的控制权;例如下面的fun2中调用了fun1,但是fun1和fun2中都加了锁,如果使用mutex,在fun1加锁,在fun2中再次加锁,就会造成死锁;所以recursive_mutex可以避免递归嵌套调用时,造成的死锁问题;递归调用不会死锁,同一线程使用recursive_mutex加锁次数和解锁次数相等时释放控制权;

#include 
#include 
#include 

class X {
    std::recursive_mutex m;
    std::string shared;
public:
    void fun1() {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun1";
        std::cout << "in fun1, shared variable is now " << shared << '\n';
    }
    void fun2() {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun2";
        std::cout << "in fun2, shared variable is now " << shared << '\n';
        fun1(); // 递归锁在此处变得有用
        std::cout << "back in fun2, shared variable is " << shared << '\n';
    };
};

int main()
{
    X x;
    std::thread t1(&X::fun1, &x);
    std::thread t2(&X::fun2, &x);
    t1.join();
    t2.join();
}

基于多线程并发-STL之递归锁recursive_mutex_第1张图片
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

你可能感兴趣的:(并发编程,C++,recursive_mutex,递归,锁,标准库)