C++11使用std::future和std::promise实现线程同步和异步通信

std::future 和 std::promise 是 C++11 引入的标准库特性,用于实现线程间的异步通信和同步。它们提供了一种机制,使一个线程能够生成一个值或异常,并让另一个线程获取这个值或异常。

(线程A中设置结果)
std::promise 用于设置异步操作的结果
(线程B中获取结果)
std::future   提供了一种机制,使线程能够等待异步操作的结果

示例:std::promise 和 std::future的使用

#include <iostream>
#include <thread>
#include <future>// 线程函数,使用 promise 设置结果
void set_promise_value(std::promise<int>& prom) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作prom.set_value(42); // 设置 promise 的结果值
}int main() {// 创建 promise 对象std::promise<int> prom;// 获取与 promise 关联的 future 对象std::future<int> fut = prom.get_future();// 创建线程,并将 promise 传递给线程函数std::thread t(set_promise_value, std::ref(prom));// 在主线程中等待 future 的结果std::cout << "Waiting for result..." << std::endl;int result = fut.get(); // 获取结果(此时会阻塞,直到 promise 设置结果)// 输出结果std::cout << "Result: " << result << std::endl;// 等待线程结束t.join();return 0;
}
使用 std::async

std::async 提供了一个更简单的方法来启动异步任务并获取其结果。下面是一个使用 std::async 的示例:

#include <iostream>
#include <future>// 异步任务函数
int async_task() {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作return 42;
}int main() {// 启动异步任务std::future<int> fut = std::async(std::launch::async, async_task);// 在主线程中等待异步任务的结果std::cout << "Waiting for result..." << std::endl;int result = fut.get(); // 获取结果(此时会阻塞,直到异步任务完成)// 输出结果std::cout << "Result: " << result << std::endl;return 0;
}

总结

  • std::future:用于获取异步操作的结果,可以阻塞直到结果可用(eg:std::future.get()方法)。
  • std::promise:用于设置异步操作的结果,通常与 std::future 一起使用。
  • std::async:提供了一种简单的方式来启动异步任务并返回一个 std::future,用于获取任务结果。

通过使用 std::future 和 std::promise,可以方便地在不同线程之间进行同步和数据传递,简化了异步编程的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术

标题&#xff1a;【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术 Jupyter Notebook是一个流行的开源Web应用程序&#xff0c;允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。而Git是一个广泛使用的分布式版本控制系统&#xff0c;用于跟…

关于C#在WPF中如何使用“抽屉”控件

关于C#在WPF中如何使用“抽屉”控件 1.前提准备2.XAML代码3.对应的C#代码4.显示效果1.前提准备 需要引用MaterialDesign控件库,关于如何引用,请参照文章——关于C#如何引用MaterialDesign控件库 2.XAML代码 <Window x:Class="MaterialDesign_Test.MainWindow"…

化身成羊:关于羊的词群探析

在西方的神话故事中&#xff0c;像主神宙斯&#xff0c;或者基督教义中的上帝&#xff0c;通常都有化身成羊的形象。 那为什么会这样呢&#xff1f; 一、什么是神话(myth)&#xff1f; 神话&#xff0c;正式的用词是 mythology&#xff1a; mythology n.神话&#xff1b;神话…

Http接口RestSharp中StatusCode返回0, 但服务器或本地postman获取应答正常(C#)

我的本地和其他服务器用同一段代码都可以访问&#xff1a; 原代码&#xff1a; RestClient client new RestClient(url); client.Timeout -1; RestRequest request new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer " acc…

Echarts中的折线图,多个Y轴集中在左侧(在Vue中使用多个Y轴的折线图)

简述&#xff1a;在 ECharts 中&#xff0c;创建一个带有多个 Y 轴的折线图&#xff0c;并且将这些 Y 轴都集中显示在图表的左侧&#xff0c;可以通过合理配置 yAxis 和 series 的属性来实现。简单记录 一. 函数代码 drawCarNumEcs() {// 初始化echarts图表,并绑定到id为"…

网络安全设备——探针

网络安全设备探针是一种专门用于网络安全领域的工具&#xff0c;它通过对网络流量进行监控和分析&#xff0c;帮助发现和防止网络攻击。以下是对网络安全设备探针的详细解释&#xff1a; 定义与功能 定义&#xff1a;网络安全设备探针是一种设备或软件&#xff0c;它通过捕获…

【docker】运行阶段遇到的问题

目录 1、查询docker 下挂载了哪些工具 2、docker中的简单命令 3、实际场景应用&#xff08;redis&#xff09; 目前工作中仅用到了redis,所以没有太多经验可以交流&#xff0c;暂时仅将我目前遇到的进行发布。还请见谅。 1、查询docker 下挂载了哪些工具 docker ps -a 或者…

Vue组件如何“传话”?这里有个小秘诀!

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-组件通信 目录 Vue组件通信 &#xff08;1&#xff09; props / $emit 1. 父组件向子组件传…

适合职场小白的待办事项管理方法和工具

刚入职场那会儿&#xff0c;我每天都像只无头苍蝇&#xff0c;忙得团团转却效率低下。待办事项像潮水般涌来&#xff0c;会议、报告、客户跟进……每一项都像是悬在头顶的利剑&#xff0c;让我焦虑不堪。我深知&#xff0c;管理好待办事项是职场生存的必修课&#xff0c;但该如…

内衣洗衣机哪个牌子好用?倾力推荐四大热门产品,质量放心

在当今社会&#xff0c;内衣洗衣机已经成为每个家庭必不可少的家电之一。但由于市场上的内衣洗衣机品牌和型号繁多&#xff0c;对于消费者来说&#xff0c;选择一款实用、性价比高的内衣洗衣机是非常重要的。那么&#xff0c;内衣裤洗衣机哪个品牌最好&#xff1f;接下来我将会…

框架为我们做了什么?

1. SpringBoot 1.1 web服务器 Spring Boot 的 web 服务器原理主要基于其嵌入式服务器的概念&#xff0c;这意味着它内嵌了一个 web 服务器&#xff0c;无需部署到外部服务器上。Spring Boot 内嵌了如 Tomcat、Jetty 或 Undertow 等 servlet 容器。 1.2 servlet Servlet&…

【鸿蒙学习笔记】创建自定义组件

官方文档&#xff1a;创建自定义组件 目录标题 自定义组件的基本结构&#xff11;・struct 自定义组件名 {...}&#xff20;ComponentEntry &#xff11;・ &#xff12;・ &#xff13;・ &#xff14;・ &#xff15;・ &#xff16;・ &#xff17;・ &#xff18;・ &…

Python | Leetcode Python题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseList(self, head: Optional[ListNode]) -> Optio…

VulnHub靶场之DarkHole_1

1 信息收集 1.1 主机发现 arp-scan -l 主机IP地址为&#xff1a;192.168.1.17 1.2 端口和服务扫描 nmap -sS -sV -A -T5 -p- 192.168.1.17 开放22&#xff0c;80端口 1.3 目录扫描 dirsearch -u 192.168.1.17 2 渗透 2.1 访问端口 2.2 注册账号 暴力破解不现实&#…

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等&#xff0c;数据都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数&#xff1a;signData {dat…

【AI原理解析】-目标检测概述

目录 一、目标检测算法的分类 1. 基于传统方法的目标检测算法 2. 基于深度学习的目标检测算法 二、主要目标检测算法 1. R-CNN系列 2. YOLO系列 3. SSD 4. RetinaNet 三、目标检测算法的特点 四、评估指标 五、应用领域 一、目标检测算法的分类 目标检测算法主要分…

java版本ERP管理系统源码 Spring Cloud ERP_ERP系统_erp软件_ERP管理系统

在当今数字化时代&#xff0c;企业对高效、稳定且易于扩展的管理系统的需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、Spring Boot、…

python-计算矩阵边缘元素之和(赛氪OJ)

[题目描述] 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。输入&#xff1a; 输入共 m 1 行。 第一行包含两个整数 m, n (1 < m,n < 100) &#xff0c;分别为矩阵的…

VDS虚拟导播切换台软件

VDS 导播软件是一款功能强大的虚拟导播系统软件&#xff0c;具有全媒体接入、播出内容丰富、调音台、快捷切播与导播键盘、云台控制等特点&#xff0c;同时支持向多个平台直播推流。以下是一些常见的 VDS 导播软件特点&#xff1a; 1. 全媒体接入&#xff1a;支持多种设备和网…

Ubuntu和Windows系统之Mamba_ssm安装

Mamba的论文&#xff1a;https://arxiv.org/abs/2312.00752 Mamba的github&#xff1a;https://github.com/state-spaces/mamba 一、Ubuntu安装 直接新建一个环境是最好的&#xff0c;不然很容易产生各种冲突 # 创建环境和相关包 conda create -n mamba python3.10.13 cond…