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(); }
输出结果
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView