stdthread(6)并发lockGuard
1. 使用场景
mutex是不安全的,当一个线程在解锁之前异常退出了,那么其它被阻塞的线程就无法继续下去。
2. lock_guard
相对安全,它是基于作用域的,能够自解锁.
- 当该对象创建时,它会像m.lock()一样获得互斥锁
- 当生命周期结束时,它会自动析构(unlock),不会因为某个线程异常退出而影响其他线程。
int cnt = 20;
std::mutex m;
void t1()
{while (cnt > 0){ std::lock_guard<std::mutex> lockGuard(m);// std::m.lock();if (cnt > 0){//sleep(1);--cnt;std::cout << "t1 " << cnt << std::endl;}// std::m.unlock();}
}
void t2()
{while (cnt > 0){std::lock_guard<std::mutex> lockGuard(m);// std::m.lock();if (cnt > 0){--cnt;std::cout << "t2 " << cnt << std::endl;}// std::m.unlock();}
}int test(void)
{std::thread th1(t1);std::thread th2(t2);th1.join(); //等待t1退出th2.join(); //等待t2退出std::cout << "test" << std::endl;return 0;
}
输出结果与mutex一样
stdthread(6)并发lockGuard相关推荐
- stdthread(7)并发unique_lock灵活性
1. 可以在声明后的任意位置调用, 可以缩小锁的作用范围,提供更高的并发度 #include <iostream> #include <mutex> #include < ...
- stdthread(8)并发recursive_mutex 递归锁
1. 使用场景:死锁 MutexLock mutex; void foo() { mutex.lock(); // do something mutex.unlock(); } void bar() ...
- stdthread(7)并发unique_lock
1. std::unique_lock与std::lock_guard类似.通过对lock和unlock进行一次薄的封装,都能实现自动加锁与解锁功能,但是std::unique_lock要比std:: ...
- stdthread(6)并发mutex
1. mutex是用来保证线程同步的,防止不同的线程同时操作同一个共享数据 1.1 C++11四种互斥量 std::mutex,最常用,普遍的互斥量(默认属性),独占式互斥量 std::recursi ...
- stdthread(5)并发atomic
1. 原子数据类型 不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型. 在现代 CPU 体系结构下提供了 CPU 指令级的原子操作, std::atomic 模板使得我们 ...
- [Linux](16)网络编程:网络概述,网络基本原理,套接字,UDP,TCP,并发服务器编程,守护(精灵)进程
文章目录 网络协议初识 OSI 七层模型 TCP/IP 四层(或五层)模型 IP.MAC.端口号 TCP 协议与 UDP 协议 套接字 套接字地址结构 socket 函数 bind 函数 recvfr ...
- mysql并发更新数据,多用户并发修改数据解决方案。
mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...
- 连接池和协程池为何能提升并发能力?
你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...
- 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...
最新文章
- 代数系统思维导图_线性代数思维导图专题
- bzoj3522 Hotel
- 如何解决Windows Update错误80070003
- springBoot 项目 jar/war打包 并运行
- 蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分
- 猎取人心的36条黄金法则
- 我的世界服务器修改数据,我的世界常用指令大全,轻松调整服务器数值状态
- 架构师入门知识体系树
- LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)
- 263. Ugly Number
- CrystalDiskInfo 各项参数说明
- 2353410-03-2,TCO-PEG8-acid末端羧酸(CO2H)可在活化剂(例如EDC或HATU)存在下与伯胺基反应以形成稳定键
- 页错误异常处理(page fault)的实现
- faker 无敌了,专注于制作假数据
- 无广告托管应用,免费的应用分发平台,提供下载次数等数据统计,Android、ios应用合并,一个二维码搞定
- 想做程序首先就学正则表达式
- Vue axios请求自带域名,接口及项目名
- matlab 嵌套循环
- nova6se是华为鸿蒙系统吗,华为荣耀9x和nova6se哪个性价比高?_科技数码通
- codevs 1218 疫情控制
热门文章
- 印象笔记html预览,7 个方法,把印象笔记打造成轻量级笔记工具
- php怎么定义索引,PHP未定义的索引/变量
- 通过设计绿色数据中心寻求循环经济
- 弱电工程室内外光纤敷设有哪些技术要求
- 451 Research发布《2019年数据中心服务和基础设施预测》
- 思科三层交换机不同vlan互通_利用单个三层交换机实现不同vlan和不同网段之间互通(华为和cisco)...
- Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测
- Paper:《Adam: A Method for Stochastic Optimization》的翻译与解读
- 成功解决pyinstaller生成exe缺少各种包的问题
- Interview:算法岗位面试—10.17早上—上海某科技公司算法岗位(偏算法,独角兽)非技术面试之比赛项目讲解和项目意义的探讨