并发编程(4)同步并发操作
一、主要涉及
- 等待事件
- 带有期望的等待一次性事件
- 在限定时间内等待
- 使用同步操作简化代码
在上一章中,我们看到各种在线程间保护共享数据的方法。当你不仅想要保护数据,还想对单独的线程进行同步。例如,在第一个线程完成前,可能需要等待另一个线程执行完成。 C++ 标准库提供了一些工具可用于同步操作,形式上表现为条件变量(condition variables)和期望(futures)。
二、等待一个条件或者事件
1、选择是在等待线程在检查间隙,使用 std::this_thread::sleep_for() 进行周期性的间歇;
2、(也是优先的选择)是,使用C++标准库提供的工具去等待事件的发生。通过另一线程触发等待事件的机制是最基本的唤醒方式(例如:流水线上存在额外的任务时),这种机制就称为“条件变量”。从概念上来说,一个条件变量会与多个事件或其他条件相关,并且一个或多个线程会等待条件的达成。
C++标准库对条件变量有两套实现: std::condition_variable 和 std::condition_variable_any
展示了一种使用条件变量做唤醒的方式:
std::mutex mut; std::queue<data_chunk> data_queue; // 1 std::condition_variable data_cond;//准备数据线程 void data_preparation_thread() {while(more_data_to_prepare()){data_chunk const data=prepare_data();std::lock_guard<std::mutex> lk(mut);//队列上锁data_queue.push(data); // 2 将数据压入队列data_cond.notify_one(); // 3std::condition_variable 的notify_one()成员函数,对等待的线程(如果有等待
//线程)进行通知
}
}
//处理数据线程
void data_processing_thread()
{ while(true){std::<std::mutex> lk(mut); //data_cond.wait(lk,[]{return !data_queue.empty();}//检测队列是否有数据写入了 ); // 5data_chunk data=data_queue.front();//对数据处理data_queue.pop();lk.unlock(); // 6process(data);if(is_last_chunk(data))break;} }
wait()会去检查这些条件(通过调用所提供的lambda函数),当条件满足(lambda函数返回true)
时返回。如果条件不满足(lambda函数返回false),wait()函数将解锁互斥量,并且将这个线程
(上段提到的处理数据的线程)置于阻塞或等待状态。
条件变量时,处理数据的线程从睡眠状态中苏醒,重新获取互斥锁,并且对条件再次检查,在条件满足的情况下,从wait()返回并继续持有锁。当条件不满足时,线程将对互斥量解锁,并且重新开始等待。这就是为什么用 std::unique_lock (4)而不使用 std::lock_guard ——等待中的线程必须在等待期间解锁互斥量,并在这这之后对互斥量再次上锁。
三、期望
四、信号量
转载于:https://www.cnblogs.com/huangfuyuan/p/9129340.html
并发编程(4)同步并发操作相关推荐
- python 线程同步_Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...
- JavaWeb 并发编程 与 高并发解决方案
在这里写写我学习到和自己所理解的 Java高并发编程和高并发解决方案.现在在各大互联网公司中,随着日益增长的互联网服务需求,高并发处理已经是一个非常常见的问题,在这篇文章里面我们重点讨论两个方面的问题 ...
- 01 - Java并发编程与高并发解决方案笔记-基础篇
01 - Java并发编程与高并发解决方案笔记-基础篇 基础篇很重要!很重要!很重要!!!一定要理解和认真思考. 01 - Java并发编程与高并发解决方案笔记-基础篇 1.课程准备 2.并发编程基础 ...
- Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...
JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
- 线程互斥与同步 在c#中用mutex类实现线程的互斥_Golang 并发编程与同步原语
5.1 同步原语与锁 · 浅谈 Go 语言实现原理draveness.me 当提到并发编程.多线程编程时,我们往往都离不开『锁』这一概念,Go 语言作为一个原生支持用户态进程 Goroutine 的 ...
- Golang 并发编程之同步原语
当提到并发编程.多线程编程时,我们往往都离不开『锁』这一概念,Go 语言作为一个原生支持用户态进程 Goroutine 的语言,也一定会为开发者提供这一功能,锁的主要作用就是保证多个线程或者 Goro ...
- java并发编程并发容器_Java并发编程:同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
- Java并发编程:同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
最新文章
- [Python]数据类型、常量、变量和运算符(未完待续)
- Servlet的默认设置
- 47 单例模式 和装饰器
- 什么是Memcache
- 程序员的二十句励志名言,看看你最喜欢哪句?
- 计算机硬盘共享配额,Win10磁盘配额是什么,怎么用?
- 蔡高厅老师 - 高等数学阅读笔记 - 06 - 高阶导数 隐函数- 02 (28、29、30、31)
- CentOS 开机自启动配置方法
- 当红开发语言Go,真的是未来的技术主流吗?
- 计算机装配方案之游戏发烧型,5000元Intel八代i5-8500配RX580电脑配置 畅玩各类中大型游戏...
- 接口性能测试方案设计方法有哪些?要怎么去写?
- P1527,JZOJ 2908【集训队互测 2012】矩阵乘法(mat)
- jupyter notebook无法连接python3服务器内核 一直显示正在连接服务器
- MAC强制卸载软件 如遇“不能修改或删除“*”,因为macOS需要它”
- 详谈如何实现手机浏览器跳转微信指定页面加好友及跳转微信公众号一键关注
- 索引前缀[ AK、IK、PK、CK 、FK、DF、UQ]
- jNs 在 ASP.NET MVC 项目中的应用
- eureka:自我保护机制_对自我怀疑的开发人员:您足够好吗?
- 【中科三方】高防DNS如何实现对DDoS攻击的流量清洗?
- 微信小程序云函数请求接口
热门文章
- 网络推广运营主要做些什么
- 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
- 经过实践的小企业的生存之道
- vs2019加载调试动态库dll文件
- 使用trycatch获取异常问题
- 修复SQL Server 2016年Microsoft.AnalysisServices.AdomdClientUI.dll程序集错误的前4个选项
- azure备份存储层分类_备份到Azure –为什么要这样做?
- ef 连接localdb_如何连接和使用Microsoft SQL Server Express LocalDB
- 像MIUI一样做Zabbix二次开发(5)——那些坑和优化方向
- [LeetCode] 144. Binary Tree Preorder Traversal Java