std::recursive_mutex 与 std::mutex 一样,也是一种可以被上锁的对象,但是和 std::mutex 不同的是,std::recursive_mutex 允许同一个线程对互斥量多次上锁(即递归上锁),来获得对互斥量对象的多层所有权,std::recursive_mutex 释放互斥量时需要调用与该锁层次深度相同次数的 unlock(),可理解为 lock() 次数和 unlock() 次数相同,除此之外,std::recursive_mutex 的特性和 std::mutex 大致相同。

  例如函数a需要获取锁mutex,函数b也需要获取锁mutex,同时函数a中还会调用函数b。如果使用std::mutex必然会造成死锁。但是使用std::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);shared = "fun1";std::cout << "in fun1, shared variable is now " << shared << '\n';}void fun2() {std::lock_guard<std::recursive_mutex> lk(m);shared = "fun2";std::cout << "in fun2, shared variable is now " << shared << '\n';fun1(); // 递归锁在此处变得有用std::cout << "back in fun2, shared variable is " << shared << '\n';};
};int main()
{X x;std::thread t1(&X::fun1, &x);std::thread t2(&X::fun2, &x);t1.join();t2.join();
}
可能的输出:
in fun1, shared variable is now fun1
in fun2, shared variable is now fun2
in fun1, shared variable is now fun1
back in fun2, shared variable is fun1

std::recursive_mutex嵌套锁/递归锁相关推荐

  1. 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】

    第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...

  2. 可重入锁(递归锁) 互斥锁属性设置

    前言: 上一次刷博客的时候,看到了自旋锁,通过学习Linux内核,对自旋锁有了一定的了解.在学习的过程中看到这么一句话--自旋锁是不可递归的.自旋锁不可递归,难道有可以递归的锁?带着这个问题,我们来看 ...

  3. 11.python并发入门(part4 死锁与递归锁)

    一.关于死锁. 死锁,就是当多个进程或者线程在执行的过程中,因争夺共享资源而造成的一种互相等待的现象,一旦产生了死锁,不加人工处理,程序会一直等待下去,这也被称为死锁进程. 下面是一个产生" ...

  4. 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池

    递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...

  5. python中的多线程 GIL(全局解释器锁) 死锁与递归锁

    1.什么的是线程 在程序里一个执行路线就叫做线程,线程是程序执行的最小单位 2.多线程的优点 使用线程可以把占据长时间的程序中的任务放到后台去处理. 在处理I/O密集程序的运行速度可能加快(ps:计算 ...

  6. 线程 守护线程 递归锁

    ------------------------------方法不对,功力全废;做事讲方法,做人讲原则. # # ------------------------------------------- ...

  7. stdthread(8)并发recursive_mutex 递归锁

    1. 使用场景:死锁 MutexLock mutex; void foo() { mutex.lock(); // do something mutex.unlock(); } void bar() ...

  8. c++ 11 recursive_mutex 递归锁

    定义于头文件 <mutex> class recursive_mutex; (C++11 起) recursive_mutex 类是同步原语,能用于保护共享数据免受从个多线程同时访问. r ...

  9. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...

    线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...

最新文章

  1. 《maven官方文档》5分钟开始Maven
  2. 盘点国内互联网圈中程序员出身的商业大佬,看谁主沉浮!
  3. 基于Redis实现分布式锁,避免重复执行定时任务
  4. asp.net控件开发基础(20)
  5. python两人一碰_python运用pygame库实现双人弹球小游戏
  6. 腾讯QQ空间g_tk算法
  7. 网页浏览器 市面上存在的网页浏览器
  8. 不同分支设置不同的远程仓库
  9. Heritrix 3.1.0 源码解析(十四)
  10. python批量下载bilibili视频_如何批量下载bilibili的视频?
  11. java给byte赋值_关于JAVA中Byte数据类型二进制赋值运算报错问题
  12. 100并发 - 千万并发,阿里淘宝的 14 次架构演进之路
  13. 实现JPA的懒加载和无外键
  14. C语言pow函数的调用
  15. 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
  16. 我的团长我的团——真正的中国军人
  17. How Does Linphone Toggle SIP Contact?
  18. 趣味题系列(6):帽子戏法
  19. Selenium WebDriver API 进阶使用,模块化参数化进行自动化测试设计
  20. 2021年高处作业登高架设证笔试考试题库

热门文章

  1. 国产编程语言又造假,丢不起这人!
  2. 「第一弹」电子设计大赛应该准备什么?
  3. HLS中数据的合并与拆分
  4. android 画布裁剪,一种基于Android系统对UI控件进行轮廓剪裁及美化的方法与流程...
  5. mysql索引底层图_MySQL索引底层数据结构
  6. vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...
  7. kodi android设置中文,Kodi(原XBMC)
  8. 怪哉翻译软件测试,翻译怪哉虫文言文
  9. mysql 插入当前时间_MySql优化之前期探索
  10. 绵阳python培训_《绵》原文及翻译海绵翻译