C++11并发与多线程笔记(8) condition_variable、wait、notify_one、notify_all
C++11并发与多线程笔记(8) condition_variable、wait、notify_one、notify_all
- 1、条件变量condition_variable、wait、notify_one、notify_all
- 1.1 std::condition_variable
- 1.2 wait()
- 1.3 notify_one()
- 1.4 notify_all()
- 2、深入思考
1、条件变量condition_variable、wait、notify_one、notify_all
1.1 std::condition_variable
实际上是一个类,是一个和条件相关的类,说白了就是等待一个条件达成。
1.2 wait()
-
wait()只有一个参数(相当于第二个参数为true)
void wait( std::unique_lock<std::mutex>& lock )先解锁之前获得的互斥量mutex,然后阻塞当前的执行线程。把当前线程添加到等待线程列表中,该线程会持续阻塞直到被 ** notify_one()** 唤醒。被唤醒后,该thread会尝试重新获取互斥量mutex,获取到mutex后执行后面的动作。
-
wait()有两个参数
void wait( std::unique_lock<std::mutex>& lock, Predicate pred )
设置了第二个参数 Predicate, 只有当pred为false时,wait才会阻塞当前线程。这情况下,线程被唤醒后,先获取mutex,再次判断pred的值。如果pred为false,则会释放mutex并重新阻塞在wait。
wait() 效果就是把锁释放并阻塞,以便于其他人去获取,不然条件不满足时,一遍遍去询问,太浪费时间。
1.3 notify_one()
随机唤醒一个等待的线程
notify_one() 唤醒一个线程不一定能成功,如果要唤醒的线程不在wait()处等待,将没有唤醒效果。
1.4 notify_all()
唤醒所有等待的线程
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;list<int> test_list;
mutex myMutex1;//创建一个互斥量condition_variable my_cond;//生成一个条件变量对象
void in_list() {for (int num = 0; num < 100000; num++) {{cout << "插入数据:" << num << endl;unique_lock<mutex> myUniLock(myMutex1);//操作事务test_list.push_back(num);my_cond.notify_one();//我们尝试把wait()的线程唤醒,执行完这行,那么out_list()里边的wait就会被唤醒}}
}void out_list() {int command = 0;while (true) {unique_lock<mutex> myUniLock(myMutex1);//如果第二个参数lambda表达式返回值是false,那么wait()将解锁互斥量,并堵塞到本行,my_cond.wait(myUniLock, [=] {//一个lambda就是一个可调用的对象(函数)if (!test_list.empty())return true;return false;});//流程只要走到这里来,这个互斥锁一定是锁着的command= test_list.front();//返回第一个元素,但不检查元素是否存在test_list.pop_front();//移除第一个元素,但不返回myUniLock.unlock();//可以提前解锁,以免锁住太长时间//执行其它非共享数据业务cout << "out_list()执行,取出一个元素" << command << endl;}
}
int main()
{thread in_thread(in_list);thread out_thread(out_list);out_thread.join();in_thread.join();cout << "I love China!" << endl;return 0;
}
2、深入思考
上面的代码可能导致出现一种情况:
因为out_list()与in_list()并不是一对一执行的,所以当程序循环执行很多次以后,可能在test_list中已经有了很多消息,但是,out_list还是被唤醒一次只处理一条数据。这时可以考虑把out_list多执行几次,或者对in_list进行限流。
相关文章:
C++11并发与多线程笔记(8) condition_variable、wait、notify_one、notify_all
C11并发与多线程笔记(8) condition_variable、wait、notify_one、notify_all 1、条件变量condition_variable、wait、notify_one、notify_all1.1 std::condition_variable1.2 wait()1.3 notify_one()1.4 notify_all() 2、深入思考 1、条件变量condition_…...
C语言——通讯录详解(动态版)
通讯录详解 前言:一、定义一个通讯录二、初始化三、增加联系人3.1 给通讯录扩容3.2增加联系人 四、释放内存五、完整代码 前言: 我们已经学过了通讯录的静态版,但是它的缺点很明显,通讯录满了就添加不了联系人了啦。我再让通讯录升…...
【云原生】kubernetes应用程序包管理工具Helm
Helm 什么是 Helm 安装 Helm 重要概念 使用 Helm 1 简介 官网地址: Helm Helm是一个Kubernetes应用程序包管理工具,它允许你轻松管理和部署Kubernetes应用程序。Helm通过使用称为Charts的预定义模板来简化Kubernetes应用程序的部署和管理。Chart包含了一组Ku…...
蓝牙资讯|苹果Apple Watch可手势操控Mac和Apple TV等设备
根据美国商标和专利局(USPTO)公示的清单,苹果公司近日获得了一项技术专利,概述了未来的 Apple Watch 手表,使用手势等操控 Mac 和 Apple TV 等设备。 该专利描述未来 Apple Watch 可以交互实现编辑图像、绘图、处理文…...
认识excel篇2之如何快速输入数据
一、快速输入数据(快捷键功能的使用) 1、鼠标左键填充:复制填充、等差序列填充(行、列是一样的) 步骤:选中单元格,鼠标放置到单元格右下角待鼠标箭头变成实心十字架,左键向下拖拽&…...
将eNSP Pro部署在华为云是什么体验
eNSP Pro简介 eNSP Pro 是华为公司数据通信产品线新推出的数通设备模拟器,主要应用在数据通信技能培训,为使用者提供华为数据通信产品设备命令行学习环境。 具备的能力 多产品模拟能力:支持数据通信产品线NE路由器、CE交换机、S交换机、AR…...
Intelij IDEA 配置Tomcat解决Application Server不显示的问题
今天搭建war工程时部署项目发现,IDEA的控制台没有Application Servers,在网上查了一下,总结几个比较好的解决方法,为了方便自己和其他人以后碰到相同的问题,不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…...
php+echarts实现数据可视化实例
效果: 代码: php <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv&quo…...
Kotlin~Bridge桥接模式
概念 抽象和现实之间搭建桥梁,分离实现和抽象。 抽象(What)实现(How)用户可见系统正常工作的底层代码产品付款方式定义数据类型的类。处理数据存储和检索的类 角色介绍 Abstraction:抽象 定义抽象接口&…...
【ES6】箭头函数和普通函数的区别
它们之间的区别: (1)箭头函数没有自己的this。 (2)不可以当作构造函数,不可以对箭头函数使用new命令,否则抛出错误。 (3)不可以使用arguments对象,该对象在函…...
【网络基础实战之路】VLAN技术在两个网段中的实际应用详解
系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…...
密码学学习笔记(十九):密码学关键术语的解释1
数据加密标准(DES) 数据加密标准是使用最广泛的加密体制,它于1977年被美国国家标准和技术研究所(NIST)采纳为联邦信息处理标准FIPS PUB 46。 DES3DESAES明文分组长度(位)6464128密文分组长度(位)6464128密钥长度&…...
angular中如何定义一个全局组件?
需求,我们需要新建一个navBreadcrumb的全局组件。这是一个面包屑导航,在不同的页面引入时传入一个路由数组即可。 第一步:我们新建这个组件: ng g c navBreadcrumb ng g m navBreadcrumb----------nav-breadcrumb.module-------…...
HTTP与HTTPS的区别
面试常见问题,HTTPS优化总结易记版: 1、HSTS重定向技术:将http自动转换为https,减少301重定向 2、TLS握手优化:在TLS握手完成前客户端就提前向服务器发送数据 3、会话标识符:服务器记录下与某客户端的会…...
JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践 | 京东云技术团队
前言 自 2014 年发布以来, JDK 8 一直都是相当热门的 JDK 版本。其原因就是对底层数据结构、JVM 性能以及开发体验做了重大升级,得到了开发人员的认可。但距离 JDK 8 发布已经过去了 9 年,那么这 9 年的时间,JDK 做了哪些升级&am…...
英伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](1)——使用方法
英伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](1)——使用方法 Apex是Nvdia维护的pytorch工具库,包括混合精度训练和分布式训练,Apex的目的是为了让用户能够更早的使用上这些“新鲜出炉”的训练工具。ASP࿰…...
接口测试,负载测试,并发测试,压力测试区别
接口测试 1.定义:接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 2.目的…...
WebRTC +Signal + ICE
在 WebRTC 中,ICE(Interactive Connectivity Establishment)服务是用于解决网络地址转换(NAT)和防火墙障碍的关键组件。以下是一些常见的开源 ICE 服务框架,可以用于搭建 ICE 服务器来支持 WebRTC 连接&…...
循环内的try-catch 跟循环外的try-catch有什么不一样
起因:一位面试管突然问了这么一道基础的面试题,反而秀了面试者一脸,经常用的却被问到时不知道怎么回答,所以我们平时在写代码的时候,要多注意细节跟原理。也许你不服:不就是先这样,再那样&#…...
C语言实现Java三大特性
// 前言 面向对象的java语言有着多种设计模式与特性。比如封装、继承、多态等等。 在这篇文章中,我会使用java的代码思路,实现C语言版的JAVA三大特性。 并从写代码的角度,从0开始构建。 定义结构体(对象) 设计了一…...
从IntelliJ到VSCode:开发体验无缝迁移完全指南
从IntelliJ到VSCode:开发体验无缝迁移完全指南 【免费下载链接】vscode-intellij-idea-keybindings Port of IntelliJ IDEA key bindings for VS Code. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intellij-idea-keybindings 一、发现迁移痛点&…...
Apache HBase与Spark集成终极指南:10个实时数据处理高效方案
Apache HBase与Spark集成终极指南:10个实时数据处理高效方案 【免费下载链接】hbase Apache HBase 项目地址: https://gitcode.com/GitHub_Trending/hb/hbase Apache HBase是一个高可靠性、高性能、面向列的分布式存储系统,非常适合存储海量结构化…...
如何在5分钟内开始使用Ivy Wallet:新手入门教程
如何在5分钟内开始使用Ivy Wallet:新手入门教程 【免费下载链接】ivy-wallet Ivy Wallet is an open-source money manager app for android that you can either build or download from Google Play. 项目地址: https://gitcode.com/gh_mirrors/iv/ivy-wallet …...
别再折腾官方源了!用XianDian-IaaS-v2.2在CentOS7上30分钟搞定OpenStack最小化部署
30分钟极速部署OpenStack:XianDian-IaaS在CentOS7上的实战指南 OpenStack作为开源云计算平台的标杆,其强大的灵活性和模块化设计吸引了大量企业用户。但官方部署流程的复杂性往往让初学者望而却步——依赖项冲突、版本兼容性问题、繁琐的配置步骤&#x…...
缠论量化工程化:从痛点突破到智能交易系统构建
缠论量化工程化:从痛点突破到智能交易系统构建 【免费下载链接】chan.py 开放式的缠论python实现框架,支持形态学/动力学买卖点分析计算,多级别K线联立,区间套策略,可视化绘图,多种数据接入,策略…...
华为交换机MAC地址漂移检测与风暴抑制联动配置指南
1. 华为交换机MAC地址漂移检测原理与实战 刚接触网络运维时,第一次遇到MAC地址漂移报警简直一头雾水。后来才发现,这其实是交换机在提醒我们:"兄弟,你的网络里可能有环路!" MAC地址漂移的本质是同一个MAC地址…...
Java后端如何优雅地封装第三方API调用逻辑以对接美团外卖霸王餐接口
Java后端如何优雅地封装第三方API调用逻辑以对接美团外卖霸王餐接口 在Java后端开发中,对接第三方API(如美团外卖霸王餐接口)是常见的需求。直接在业务代码中拼接URL、处理JSON、写HTTP请求不仅导致代码臃肿,还难以维护和测试。 本…...
Bootstrap 下拉菜单:全面解析与应用指南
Bootstrap 下拉菜单:全面解析与应用指南 引言 Bootstrap 是一个流行的前端框架,它提供了丰富的组件和工具来帮助开发者快速构建响应式、美观的网页。其中,下拉菜单是 Bootstrap 中一个常用且重要的组件,它能够帮助用户在有限的空间…...
Win11Debloat:5分钟解决Windows 11卡顿的终极优化指南
Win11Debloat:5分钟解决Windows 11卡顿的终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cu…...
5个认知重构,收割你的补偿性Offer
春招反杀指南当别人还在为秋招失利懊悔时,聪明人已经完成了思维系统的彻底升级秋招的硝烟尚未散尽,春招的号角已经吹响。这不是简单的“第二轮机会”,而是认知层面的降维打击战。那些在秋招中凭借简历光环轻松通关的路径已然失效,…...
