#include

#include

#include

using namespace std;

recursive_mutex re;

void task1()

{

re.lock();

cout << "处理任务1中..." << endl;

std::this_thread::sleep_for(1s);

re.unlock();

}

void task2()

{

re.lock();

cout << "处理任务2中..." << endl;

std::this_thread::sleep_for(1s);

re.unlock();

}

class ThreadBase

{

public:

virtual void Start()

{

is_exit = false;

th = std::thread(&ThreadBase::Main,this);

}

virtual void Stop()

{

is_exit = true;

Wait();

}

virtual void Wait()

{

if (th.joinable())

{

th.join();

}

}

bool get_exit()

{

return is_exit;

}

virtual void Main() = 0;

ThreadBase(int _i):i(_i) {}

virtual ~ThreadBase() {}

int i;

private:

std::thread th;

bool is_exit;

};

class MyThread:public ThreadBase

{

public:

MyThread(int i):ThreadBase(i) {}

~MyThread() override {}

void Main() override

{

for (;;)

{

//如果不是可重入锁,那么得先开锁然后才能执行task1,否则会造成死锁

//但是如果开锁,也就是在一个线程执行任务时,另一个线程也进来了,如果另一个线程执行了一会就结束了,肯定会

//释放锁,而实际上线程一的任务还没执行完

re.lock();

cout << "线程" << i << "拿到了锁" << endl;

task1();

task2();

re.unlock();

std::this_thread::sleep_for(1ms);

}

}

};

int main(int argc,char* argv[])

{

MyThread th_one(1);

th_one.Start();

th_one.Wait();

getchar();

return 0;

}

原文:https://www.cnblogs.com/SunShine-gzw/p/14530107.html

c语言线程锁的原理开锁原理图,C++多线程之可重入锁相关推荐

  1. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  2. Java锁的种类以及辨析(四):可重入锁

    Java锁的种类以及辨析(四):可重入锁 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数 ...

  3. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  4. java中多线程reentlock_Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  5. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  6. 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/75043422 出自[zejian ...

  7. 可重入锁的理解及公平锁和非公平锁的具体实现

    可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...

  8. 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?

    AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...

  9. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级编程题:小猴数草莓
  2. 的主机名_Mac教程——修改mac 下主机名、电脑名、局域网主机名
  3. endnote咋手动输入文献_EndNote 如何在 Word 中手动输入引文
  4. 羊皮卷的故事-第二章
  5. SAP 物料XXXXX的强制帐户设置 (输入帐户设置类别) 的问题解决方法
  6. HBase 默认配置项详细解读
  7. 打印机可以打印不能扫描怎么弄_为什么打印机可以通过电脑打印可不能扫描呢...
  8. opencv4.5.0安装包_VB6.0软件安装包以及安装教程
  9. vue --- 2.0 编译的实现
  10. P2801-教主的魔法【分块,二分】
  11. day 04 作业 循环和分之
  12. 小程序:自定义组件的实现方法及自定义组件与页面间的数据传递
  13. linux+nginx+php+mysql安装及配置
  14. var conf=confirm(确定要删除吗?);_微信查看谁删除了4种方法
  15. CKfinder中文乱码的解决.
  16. Java实现本地缓存、分布式缓存及多级缓存
  17. 今天懒一次 豆瓣电影Top250
  18. 线性同余法产生(0,1)均匀分布的随机数
  19. 微信小程序 会议室课堂考勤签到助手 源码
  20. Python当前时间是一年中第几周

热门文章

  1. Qt-线程启动与关闭实例
  2. C# SQLite 数据库操作实例2
  3. QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤
  4. MFC中动态创建button及添加响应事件
  5. Vue 消除Token过期时刷新页面的重复提示
  6. # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
  7. 学生电脑哪个牌子好_常亮补光灯哪个牌子好服务至上
  8. 宝塔面板怎么下载php,宝塔面板下怎么安装Mosquitto-php扩展
  9. 分享一下dudu回答的一个方法
  10. 绝对定位多个字居中显示的css