当前位置: 首页 > news >正文

C++ 并发编程中condition_variable和future的区别

std::condition_variable 和 std::future 的区别:

用途不同:

std::condition_variable:

就好比是一把魔法门,有两个小朋友,一个在门这边,一个在门那边。门上贴了一张纸,写着“开心时可以进来”。现在,门这边的小朋友要等着看门那边的小朋友什么时候准备好,准备好了就告诉门这边可以进来了。门这边的小朋友就用 std::condition_variable 等待门那边小朋友的通知,门那边小朋友准备好了就通知过来。

std::future:

这就像是委托一个任务给一个小助手。你告诉小助手:“嘿,你去超市买一瓶果汁,等你回来告诉我。”这里,你是主线程,小助手是异步线程,你用 std::future 去拿到小助手的结果,看他是否买到了果汁。

例子:

std::condition_variable:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool isReady = false;void friend1() {std::this_thread::sleep_for(std::chrono::seconds(2));{std::lock_guard<std::mutex> lock(mtx);isReady = true;  // 小朋友在门那边准备好了}cv.notify_one();  // 通知门这边的小朋友
}void friend2() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return isReady; });  // 等待门那边的小朋友通知std::cout << "Friend 2: Let's go inside and play!" << std::endl;
}int main() {std::thread t1(friend1);std::thread t2(friend2);t1.join();t2.join();return 0;
}

std::future:

#include <iostream>
#include <future>int buyJuice() {std::this_thread::sleep_for(std::chrono::seconds(2));return 1;  // 假设小助手成功买到果汁
}int main() {std::future<int> result = std::async(buyJuice);std::cout << "Main thread: Waiting for the assistant to come back with juice..." << std::endl;int juice = result.get();  // 阻塞等待小助手的结果std::cout << "Main thread: Got the juice! It's a refreshing " << juice << std::endl;return 0;
}

为什么不能用条件变量替代期望?

如果我们用 std::condition_variable 代替 std::future,就像用等待通知的方式得知小助手是否买到果汁。这样你就必须一直等着,无法做其他事情。而 std::future 则允许你去做其他事情,等果汁买好了再回来拿。
总的来说,它们分别解决不同的问题,std::condition_variable 用于等待通知,而 std::future 用于异步任务的结果获取。

相关文章:

C++ 并发编程中condition_variable和future的区别

std::condition_variable 和 std::future 的区别&#xff1a; 用途不同&#xff1a; std::condition_variable&#xff1a; 就好比是一把魔法门&#xff0c;有两个小朋友&#xff0c;一个在门这边&#xff0c;一个在门那边。门上贴了一张纸&#xff0c;写着“开心时可以进来…...

【保姆级教程】Linux安装JDK8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包&#xff0c;如果是其它版本&#xf…...

【备忘】ChromeDriver 官方下载地址 Selenium,pyppetter依赖

https://googlechromelabs.github.io/chrome-for-testing/#stable windows系统选择win64版本下载即可...

day08_osi各层协议,子网掩码,ip地址组成与分类

osi各层协议&#xff0c;子网掩码,ip地址组成与分类 一、上节课复习二 今日内容&#xff1a;1、子网划分 来源于http://egonlin.com/。林海峰老师课件 一、上节课复习 1、osi七层与数据传输 2、socketsocket是对传输层以下的封装ipport标识唯一一个基于网络通讯的软件3、tcp与…...

微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位

目录 1. tabbar 1.1 什么是tabbar 1.2 配置tabbar 2. 事件绑定 2.1 准备表单 2.2 事件绑定 2.3 冒泡事件及非冒泡事件 3. 数据绑定 3.1 官方文档 4. 关于模块化 5. 模板语法 6. 尺寸单位 1. tabbar 1.1 什么是tabbar 下图中标记出来的部分即为tabbar&#xff1a…...

AR工业眼镜:智能化生产新时代的引领者!!

科技飞速发展&#xff0c;人工智能与增强现实&#xff08;AR&#xff09;技术结合正在改变生活工作方式。AR工业眼镜在生产领域应用广泛&#xff0c;具有实时信息展示、智能导航定位、远程协作培训、智能安全监测等功能&#xff0c;提高生产效率、降低操作风险&#xff0c;为企…...

从0到0.01入门React | 008.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

PP-YOLO: An Effective and Efficient Implementation of Object Detector(2020.8)

文章目录 Abstract1. Introduction先介绍了一堆前人的work自己的workexpect 2. Related Work先介绍别人的work与我们的区别 3.Method3.1. ArchitectureBackboneDetection NeckDetection Head 3.2. Selection of TricksLarger Batch SizeEMADropBlockIoULossIoU AwareGrid Sensi…...

4、创建第一个鸿蒙应用

一、创建项目 此处以空模板为例来创建一个鸿蒙应用。在创建项目前请保持网页的畅通。 1、在欢迎页面点击“Create Project”。 2、左侧默认为“Application”&#xff0c;在“Template Market”中选择空模板&#xff08;Empty Ability&#xff09;&#xff0c;点击“Next” 3…...

Docker - DockerFile

Docker - DockerFile DockerFile 描述 dockerfile 是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 编写一个dockerfile 文件docker build 构建成为一个镜像docker run 运行脚本docker push 发布镜像&#xff08;dockerhub&#xff0…...

2311rust模式匹配

原文 在Rust中混合匹配,改变和移动 结构模式匹配:极大的改进了C或Java风格的switch语句. Match包含命令式和函数式编程风格:可继续使用break语句,赋值等,不必面向表达式. 按需匹配"借用"或"移动",:Rust鼓励开发者仔细考虑所有权和借用.设计匹配时仅支持…...

Linux系统软件安装方式

Linux系统软件安装方式 1. 绿色安装2. yum安装3. rpm安装3.1 rpm常用命令 4. 源码安装4.1 安装依赖包4.2 执行configure脚本4.3 编译、安装4.4 安装4.5 操作nginx4.6 创建服务器 1. 绿色安装 Compressed Archive压缩文档包&#xff0c;如Java软件的压缩文档包&#xff0c;只需…...

React + Antd 自定义Select选择框 全选、清空功能

实现代码 import React, { useState, useEffect } from react; import { Select, Space, Divider, Button } from antd;export default function AllSelect (props) {const {fieldNames, // 自定义节点labbel、value、options、grouLabeloptions, // 数据化配置选项内容&#…...

阿里云国际站:应用实时监控服务

文章目录 一、阿里云应用实时监控服务的概念 二、阿里云应用实时监控服务的优势 三、阿里云应用实时监控服务的功能 四、写在最后 一、阿里云应用实时监控服务的概念 应用实时监控服务 (Application Real-Time Monitoring Service) 作为一款云原生可观测产品平台&#xff…...

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…...

多路数据写入DDR3/DDR4的两种方法

1.官方IP实现&#xff1b; 2.手写Axi 仲裁器。...

3 分钟看完 NVIDIA GPU 架构及演进

近期随着 AI 市场的爆发式增长&#xff0c;作为 AI 背后技术的核心之一 GPU&#xff08;图形处理器&#xff09;的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要&#xff0c;特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多&#xff0c;主要就是 NVIDIA、AM…...

SMART PLC 和S7-1200PLC MODBUSTCP通信速度测试

SMART PLC MODBUSTCP通信详细介绍请参看下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.4k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的…...

C++文件操作知识点总结

文件流操作文本文件 文件流 在 C 中&#xff0c;对文件的操作是通过 stream 的子类 fstream&#xff08; file stream &#xff09;来实现的&#xff0c;所以&#xff0c;要用这种方式操作文件&#xff0c;就必须加入头文件<fstream>&#xff0c;代码如下&#xff1a; …...

开发vue3 UI组件库,并且发布到NPM

目录 1.创建vue3工程 2.创建package文件 3.编写组件&#xff0c;并且导出 4.编写package.json 5.npm账号注册登录并发布 6.从npm安装使用 7.注意事项 1.创建vue3工程 &#xff08;1&#xff09;初始化Vue项目 cnpm create vite &#xff08;2&#xff09;进入文件夹…...

Android 11文件权限避坑指南:为什么你的APP无法修改原文件?

Android 11存储权限深度解析&#xff1a;从沙盒机制到实战解决方案 在去年的一次应用升级中&#xff0c;我们团队遇到了一个棘手的问题&#xff1a;用户反馈图片编辑后无法保存到原位置。经过排查&#xff0c;发现这是Android 11引入的存储权限机制变化导致的。作为开发者&…...

利润中心(Profit Center)和段(Segment)在 SAP 中关系非常紧密,但它们的设计目的和应用场景有本质区别

利润中心&#xff08;Profit Center&#xff09;和段&#xff08;Segment&#xff09;在 SAP 中关系非常紧密&#xff0c;但它们的设计目的和应用场景有本质区别。简单来说&#xff0c;段&#xff08;Segment&#xff09;是利润中心的一个上级归类。它们之间通常是“一对多”的…...

如何用3dsconv解决3DS游戏格式兼容问题:从入门到精通的转换指南

如何用3dsconv解决3DS游戏格式兼容问题&#xff1a;从入门到精通的转换指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv …...

探索MediaPipe:从零开始构建实时计算机视觉应用的完整指南

探索MediaPipe&#xff1a;从零开始构建实时计算机视觉应用的完整指南 【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe MediaPipe是Google开源的一…...

DeerFlow2.0 Docker + 本地 Ollama qwen3.5:9b 部署指南

DeerFlow2.0 Docker 本地 Ollama qwen3.5:9b 部署指南 实现 Token 自由&#xff01;&#xff01;&#xff01;本地模型免费 &#xff1a;&#xff09; 1. 前提条件 Windows 11 家庭版&#xff08;版本号 25H2&#xff09;Docker Desktop 已安装并运行WSL2 已安装并配置Olla…...

告别桌面图标混乱:NoFences让你的数字空间井然有序

告别桌面图标混乱&#xff1a;NoFences让你的数字空间井然有序 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否曾打开电脑就被满屏散乱的图标淹没&#xff1f;工作文件…...

MetaGPT终极指南:5步开启AI驱动软件开发新时代

MetaGPT终极指南&#xff1a;5步开启AI驱动软件开发新时代 【免费下载链接】MetaGPT &#x1f31f; The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming 项目地址: https://gitcode.com/GitHub_Trending/me/MetaGPT MetaGPT是…...

5分钟搞定RetroArch缩略图:从黑屏到完美游戏封面的全攻略

5分钟搞定RetroArch缩略图&#xff1a;从黑屏到完美游戏封面的全攻略 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 还记得打开RetroArch游戏…...

Guohua Diffusion 创意编程:用Processing可视化交互控制图像生成

Guohua Diffusion 创意编程&#xff1a;用Processing可视化交互控制图像生成 你有没有想过&#xff0c;自己随手画的一条线、选择的一个颜色&#xff0c;能立刻变成一幅由AI生成的完整画作&#xff1f;这听起来像是科幻电影里的场景&#xff0c;但现在&#xff0c;通过一点创意…...

Fish-Speech-1.5在短视频生产的应用:批量生成多语种配音方案

Fish-Speech-1.5在短视频生产的应用&#xff1a;批量生成多语种配音方案 1. 引言 短视频内容创作正面临着一个普遍痛点&#xff1a;多语言配音成本高、周期长。传统方式下&#xff0c;一个MCN机构要为一条短视频制作中文、英文、日文三种语言的配音&#xff0c;需要分别联系不…...