【cmu15445c++入门】(13)C++的std::promise

一、说明

 std::promise 是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取

二、代码

#include <chrono>
#include <future>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>void accumulate(int task_cost_second, std::promise<int> accumulate_promise) {std::cout << "before set_value" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(task_cost_second));accumulate_promise.set_value(task_cost_second);  // 提醒 futurestd::cout << "after set_value" << std::endl;
}void accumulate2(int task_cost_second, std::promise<int> accumulate_promise) {std::cout << "before set_value" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(task_cost_second));accumulate_promise.set_value(task_cost_second);  // 提醒 futurestd::cout << "after set_value" << std::endl;
}int main() {// 用 promise<int> 在线程间传递结果。std::cout << "**********第一个测试**********" << std::endl;std::promise<int> accumulate_promise;std::future<int> accumulate_future = accumulate_promise.get_future();std::thread work_thread(accumulate, 3, std::move(accumulate_promise));// future::get() 将等待直至该 future 拥有合法结果并取得它// 无需在 get() 前调用 wait()// accumulate_future.wait();  // 等待结果std::cout << "before accumulate_future.get()" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(5));std::cout << "result=" << accumulate_future.get() << '\n';std::cout << "ater accumulate_future.get()" << std::endl;work_thread.join();  // wait for thread completion// 演示用 promise<void> 在线程间对状态发信号std::cout << "**********第二个测试**********" << std::endl;std::promise<int> accumulate_promise1;std::future<int> accumulate_future1 = accumulate_promise1.get_future();std::thread work_thread1(accumulate2, 3, std::move(accumulate_promise1));// future::get() 将等待直至该 future 拥有合法结果并取得它// 无需在 get() 前调用 wait()// accumulate_future.wait();  // 等待结果std::cout << "before accumulate_future.get()" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "result=" << accumulate_future1.get() << '\n';std::cout << "ater accumulate_future.get()" << std::endl;work_thread1.join();  // wait for thread completion
}

 三、结果

 不难发现两个测试用例线程的sleep时间不一样,导致的输出不一样。

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

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

相关文章

零基础自学C语言|数据在内存中的存储

✈整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下面的内容&#xff1a; 整数的2进制表示方法有三种&#xff0c;即原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c;符号位都是用0表示"正"&#xff0c;用1表示"负"&…

【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

你用多久拿下了PMP(项目管理专业人士资格认证)?

大概1个月左右&#xff0c;一般的2个月左右也差不多了。 PMP考试现在是第七版的教材&#xff0c;跟考纲了&#xff0c;相对第六版的来说增加了很多敏捷题型&#xff0c;相对要灵活很多&#xff0c;难度也有所提升&#xff0c;我的备考经历给大家参考下&#xff0c;希望对你有帮…

移动互联网时代的APP上架流程和要点

摘要 本文将介绍移动应用程序上架的基本流程和要点&#xff0c;包括应用商店注册、APP材料准备、打包上传App、APP审核以及发布APP的详细步骤。此外&#xff0c;还会提到利用appuploder工具简化iOS应用上架步骤的方法&#xff0c; 引言 在移动互联网时代&#xff0c;开发一…

Python WikiGPT代码,GPT代码实战,逐行讲解GPT代码,教你完整写完GPT代码,GPT代码模板,一文教你学会写GPT代码

1.GPT基本介绍 在GPT1诞生之前&#xff0c;NLP领域已存在多种任务&#xff0c;比如文本分类、语义相似度&#xff0c;以及问答等&#xff0c;这些任务的共同点在于它们都是有监督学习&#xff0c;且各自维护不同的量级较小的训练语料。OpenAI为了进一步提升这些任务的预测效果&…

数据可视化基础与应用-02-基于powerbi实现连锁糕点店数据集的仪表盘制作

总结 本系列是数据可视化基础与应用的第02篇&#xff0c;主要介绍基于powerbi实现一个连锁糕点店数据集的仪表盘制作。 数据集描述 有一个数据集&#xff0c;包含四张工作簿&#xff0c;每个工作簿是一张表&#xff0c;其中可以销售表可以划分为事实表&#xff0c;产品表&am…

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录&#xff0c;通常包含删除操作的时间戳和相关信息。 当一个动态库&#xff08;native程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

selenuim【1】($x(‘xpath语法’)、WebDriverWait())

文章目录 初学selenuim记录1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#…

《Spring Security 简易速速上手小册》第5章 高级认证技术(2024 最新版)

文章目录 5.1 OAuth2 和 OpenID Connect5.1.1 基础知识详解OAuth2OpenID Connect结合 OAuth2 和 OIDC 5.1.2 重点案例&#xff1a;使用 OAuth2 和 OpenID Connect 实现社交登录案例 Demo 5.1.3 拓展案例 1&#xff1a;访问受保护资源案例 Demo测试访问受保护资源 5.1.4 拓展案例…

35. 【Linux教程】Linux 修改用户组

前面小节介绍了如何添加用户组&#xff0c;本小节介绍如何给已经添加的新用户组修改信息&#xff0c;从 /etc/group 文件信息可以看到&#xff0c;用户组的信息比用户信息项少&#xff0c;和 usermod 命令类似&#xff0c;用户组的信息可以使用 groupmod 命令修改。 1. groupmo…

禁止涉密电脑插U盘

某国家机关在日常工作中发现&#xff0c;一台涉密电脑受到了不明攻击&#xff0c;大量机密文件被非法访问和复制。 经过调查&#xff0c;原来是一名工作人员在不知情的情况下&#xff0c;将感染病毒的U盘插入涉密电脑&#xff0c;导致机密数据被窃取。 事件发生后&#xff0c…

Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client

Elasticsearch入门-环境安装ES和Kibana 安装 ES Windows安装ESHead安装浏览器插件 es-clientKibana 安装 安装es,安装header 安装kibana&#xff0c;安装多种分词器ik… 安装 ES Windows安装 ① 下载压缩包并解压官网链接&#xff1a;https://www.elastic.co/cn/downloads/ela…