【C++ 11 | thread】std::recrisive_mutex


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 public:
10   void fun1()
11   {
12     std::lock_guard<std::recursive_mutex> lk(m);
13     shared = "fun1";
14     std::cout << "in fun1, shared variable is now " << shared << std::endl;
15   }
16   void fun2()
17   {
18     std::lock_guard<std::recursive_mutex> lk(m);
19     shared = "fun2";
20     std::cout << "in fun2, shared variable is now " << shared << std::endl;
21     fun1(); // recursive lock becomes useful here
22     std::cout << "back in fun2, shared variable is " << shared << std::endl;
23   };
24 };
25 
26 int main()
27 {
28   X x;
29   std::thread t1(&X::fun1, &x);
30   std::thread t2(&X::fun2, &x);
31   t1.join();
32   t2.join();
33 }

输出:

【C++ 11 | thread】std::recrisive_mutex

 

 

参考资料

1. C++ 官方文档

1.

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/244442.html

(0)
上一篇 2022年4月17日
下一篇 2022年4月17日

相关推荐

发表回复

登录后才能评论