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(); }
輸出結果