recursive_mutex 多线程使用会崩溃?

1.recursive_mutex 崩溃问题;

项目开发中使用recursive_mutex 来给变量加锁,但是会出现崩溃,如下图所示,还没有搞清楚为什么会崩溃,有大神可以留言解答下?

std::recursive_mutex m_cg_mtx_;

 

2.recursive_mutex用法

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

#include <iostream>
#include <thread>
#include <mutex>
 
class X {
    std::recursive_mutex m;
    std::string shared;
  public:
    void fun1() {
      std::lock_guard<std::recursive_mutex> lk(m);//加锁次数等于2
      shared = "fun1";
      std::cout << "in fun1, shared variable is now " << shared << '\n';
    //末尾lk析构函数调用,解锁次数等于1 }
void fun2() { std::lock_guard<std::recursive_mutex> lk(m);//加锁次数等于1 shared = "fun2"; std::cout << "in fun2, shared variable is now " << shared << '\n'; fun1(); // ① 递归锁在此处变得有用 std::cout << "back in fun2, shared variable is " << shared << '\n';
    //末尾lk析构函数调用,解锁次数等于2,解锁次数和加锁次数相等,释放控制权 }; };
int main() { X x; std::thread t1(&X::fun1, &x); std::thread t2(&X::fun2, &x); t1.join(); t2.join(); }

输出结果

 

posted @ 2022-11-01 17:55  一字千金  阅读(773)  评论(0编辑  收藏  举报