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(); }

輸出結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章