std::recursive_mutex(递归锁)
1. 类原型:
Defined in header <mutex> class recursive_mutex;
recursive_mutex。在此期间,线程可能会对lock或try_lock进行额外的调用。当线程进行匹配数量的解锁调用时,所有权期结束。
当一个线程拥有一个recursive_mutex时,所有其他线程如果试图声明recursive_mutex的所有权,将会阻塞(对于锁的调用)或接收一个错误的返回值(对于try_lock)。一个recursive_mutex被锁定的最大次数是未知的,但是达到这个数字之后,调用lock将抛出std::system_error,调用try_lock将返回false。如果一个recursive_mutex被销毁,而它仍然被某些线程拥有,那么程序的行为是未定义的。recursive_mutex类满足Mutex和StandardLayoutType的所有要求。
2. 当一个线程拥有recursive_mutex时,所有其他线程去获取recursive_mutex递归锁时,将会阻塞(对于锁的调用)或接收一个错误的返回值(对于try_lock)。
1. 代码实现
1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 5 class X 6 { 7 std::recursive_mutex m; 8 std::string shared; 9 10 public: 11 void fun1() 12 { 13 std::lock_guard<std::recursive_mutex> lk(m); 14 shared = "fun1"; 15 std::cout << "ID:" << std::this_thread::get_id() << " in fun1, shared is " << shared << std::endl; 16 } 17 void fun2() 18 { 19 std::lock_guard<std::recursive_mutex> lk(m); 20 shared = "fun2"; 21 std::cout << "ID:" << std::this_thread::get_id() << " in fun2, shared is " << shared << std::endl; 22 fun1(); 23 std::cout << "ID:" << std::this_thread::get_id() << " back in fun2, shared is " << shared << std::endl; 24 }; 25 }; 26 27 int main() 28 { 29 X x; 30 std::thread t1(&X::fun2, &x); 31 std::thread t2(&X::fun2, &x); 32 t1.join(); 33 t2.join(); 34 }
输出:
参考资料
1.