• 【C++ 11 | thread】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 
    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. C++ 官方文档

    1.

  • 相关阅读:
    在R语言中轻松创建关联网络
    在R语言中显示美丽的数据摘要summary统计信息
    R语言中不同类型的聚类方法比较
    R语言中的划分聚类模型
    R语言解释生存分析中危险率和风险率的变化
    Stata估算观测数据的风险比
    Stata 中Mata的st_view函数
    R语言多臂试验
    R语言使用倾向评分提高RCT(随机对照试验)的效率
    R语言在RCT中调整基线时对错误指定的稳健性
  • 原文地址:https://www.cnblogs.com/sunbines/p/16152535.html
Copyright © 2020-2023  润新知