标签:11 std 调用 recursive thread lock 线程 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 }
输出:
参考资料
1.
标签:11,std,调用,recursive,thread,lock,线程,mutex 来源: https://www.cnblogs.com/sunbines/p/16152535.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。