c语言线程锁的原理开锁原理图,C++多线程之可重入锁
#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++多线程之可重入锁相关推荐
- 线程同步锁 java_java多线程同步之重入锁,详细解析
上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...
- Java锁的种类以及辨析(四):可重入锁
Java锁的种类以及辨析(四):可重入锁 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数 ...
- Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- java中多线程reentlock_Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
- 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/75043422 出自[zejian ...
- 可重入锁的理解及公平锁和非公平锁的具体实现
可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...
- 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?
AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...
- Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁
List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...
最新文章
- 中国电子学会青少年编程能力等级测试图形化四级编程题:小猴数草莓
- 的主机名_Mac教程——修改mac 下主机名、电脑名、局域网主机名
- endnote咋手动输入文献_EndNote 如何在 Word 中手动输入引文
- 羊皮卷的故事-第二章
- SAP 物料XXXXX的强制帐户设置 (输入帐户设置类别) 的问题解决方法
- HBase 默认配置项详细解读
- 打印机可以打印不能扫描怎么弄_为什么打印机可以通过电脑打印可不能扫描呢...
- opencv4.5.0安装包_VB6.0软件安装包以及安装教程
- vue --- 2.0 编译的实现
- P2801-教主的魔法【分块,二分】
- day 04 作业 循环和分之
- 小程序:自定义组件的实现方法及自定义组件与页面间的数据传递
- linux+nginx+php+mysql安装及配置
- var conf=confirm(确定要删除吗?);_微信查看谁删除了4种方法
- CKfinder中文乱码的解决.
- Java实现本地缓存、分布式缓存及多级缓存
- 今天懒一次 豆瓣电影Top250
- 线性同余法产生(0,1)均匀分布的随机数
- 微信小程序 会议室课堂考勤签到助手 源码
- Python当前时间是一年中第几周
热门文章
- Qt-线程启动与关闭实例
- C# SQLite 数据库操作实例2
- QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤
- MFC中动态创建button及添加响应事件
- Vue 消除Token过期时刷新页面的重复提示
- # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
- 学生电脑哪个牌子好_常亮补光灯哪个牌子好服务至上
- 宝塔面板怎么下载php,宝塔面板下怎么安装Mosquitto-php扩展
- 分享一下dudu回答的一个方法
- 绝对定位多个字居中显示的css