[C++11]std::promise

2023-11-04

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

二、代码示例:
下面我们通过几个简单小例子逐渐深入了解std::promise的使用方法。
示例1:

#include <iostream>
#include <future>
#include <chrono>
 
void Thread_Fun1(std::promise<int> &p)
{
	//为了突出效果,可以使线程休眠5s
	std::this_thread::sleep_for(std::chrono::seconds(5));
 
	int iVal = 233;
	std::cout << "传入数据(int):" << iVal << std::endl;
 
	//传入数据iVal
	p.set_value(iVal);
}
 
void Thread_Fun2(std::future<int> &f)
{
	//阻塞函数,直到收到相关联的std::promise对象传入的数据
	auto iVal = f.get();		//iVal = 233
 
	std::cout << "收到数据(int):" << iVal << std::endl;
}
 
int main()
{
	//声明一个std::promise对象pr1,其保存的值类型为int
	std::promise<int> pr1;
	//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
	std::future<int> fu1 = pr1.get_future();
 
	//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
	std::thread t1(Thread_Fun1, std::ref(pr1));
	//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
	std::thread t2(Thread_Fun2, std::ref(fu1));
 
	//阻塞至线程结束
	t1.join();
	t2.join();
 
	return 1;
}

可以看到std::future对象fu1先是通过std::promise的函数get_future()与std::promise对象pr1相绑定,pr1在线程t1中通过set_value()传入共享数据,fu1在线程t2中通过阻塞函数get()获取到传入的数据。
示例1中传入的数据类型是int,前面介绍中说std::promise可以保存typename T的数据,那么可以保存函数指针吗?答案是可行的,请看示例。

示例2:

 #include <iostream>
#include <future>
#include <chrono>
#include <functional>
 
//声明一个可调对象T
using T = std::function<int(int)>;		//等同于typedef std::function<int(int)> T;
 
int Test_Fun(int iVal)
{
	std::cout << "Value is:" << iVal << std::endl;
	return iVal + 232;
}
 
void Thread_Fun1(std::promise<T> &p)
{
	//为了突出效果,可以使线程休眠5s
	std::this_thread::sleep_for(std::chrono::seconds(5));
 
	std::cout << "传入函数Test_Fun" << std::endl;
 
	//传入函数Test_Fun
	p.set_value(std::bind(&Test_Fun, std::placeholders::_1));
}
 
void Thread_Fun2(std::future<T> &f)
{
	//阻塞函数,直到收到相关联的std::promise对象传入的数据
	auto fun = f.get();		//iVal = 233
 
	int iVal = fun(1);
 
	std::cout << "收到函数并运行,结果:" << iVal << std::endl;
}
 
int main()
{
	//声明一个std::promise对象pr1,其保存的值类型为int
	std::promise<T> pr1;
	//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
	std::future<T> fu1 = pr1.get_future();
 
	//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
	std::thread t1(Thread_Fun1, std::ref(pr1));
	//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
	std::thread t2(Thread_Fun2, std::ref(fu1));
 
	//阻塞至线程结束
	t1.join();
	t2.join();
 
	return 1;
}

既然可以传函数对象,那么是否可以通过模板魔改,传入可变元函数?请看示例。

示例3:

 #include <iostream>
#include <future>
#include <chrono>
#include <functional>
 
//声明一个可调对象F
using F = std::function<int(int, int, int&)>;		//等同于typedef std::function<int(int, int, int&)> F;
 
//函数可以改成任意参数,任意返回类型
int Test_Fun(int a, int b, int &c)
{
	//a = 1, b = 2
	c = a + b + 230;
	return c;
}
 
void Thread_Fun1(std::promise<F> &p)
{
	//为了突出效果,可以使线程休眠5s
	std::this_thread::sleep_for(std::chrono::seconds(5));
 
	std::cout << "传入函数Test_Fun" << std::endl;
 
	//传入函数Test_Fun
	p.set_value(std::bind(&Test_Fun, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
}
 
template<typename T, typename ...Args>
void Thread_Fun2(std::future<T> &f, Args&& ...args)
{
	//阻塞函数,直到收到相关联的std::promise对象传入的数据
	auto fun = f.get();		//fun等同于Test_Fun
 
	auto fResult = fun(std::forward<Args>(args)...);
 
	std::cout << "收到函数并运行,结果:" << fResult << std::endl;
}
 
int main()
{
	//声明一个std::promise对象pr1,其保存的值类型为int
	std::promise<F> pr1;
	//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
	std::future<F> fu1 = pr1.get_future();
 
	//声明一个变量
	int iVal = 0;
 
	//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
	std::thread t1(Thread_Fun1, std::ref(pr1));
	//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
	std::thread t2(Thread_Fun2<F, int, int, int&>, std::ref(fu1), 1, 2, std::ref(iVal));
 
	//阻塞至线程结束
	t1.join();
	t2.join();
 
	//此时iVal的值变成233
 
	return 1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C++11]std::promise 的相关文章

  • protobuf版本冲突问题解决

    1 proto caffe pb h 17 2 error error This file was generated by an older version of protoc 如果你装有anaconda 以及tensorflow 或者在
  • vcpkg下载不了报错

    使用powershell 添加环境变量 env HTTPS PROXY http 127 0 0 1 7890
  • 计算机类毕业设计优秀最新题目

    主要有以下类别 python c语言 c vc opencv opengl程序设计 单片机类 51 stm32 arduino arm avr 龙芯开发板 嵌入式系统等硬件设计 程序设计 protues仿真 下列题目涵盖但不限于以上内容 4
  • 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]

    基于HOG特征的SVM分类器实现 在机器学习领域 支持向量机SVM Support Vector Machine 是一个有监督的学习模型 通常用来进行模式识别 分类 以及回归分析 方向梯度直方图 Histogram of Oriented
  • python 删除两个文件中没有一一对应的名称

    删除两个文件中没有一一对应的名称 针对于 jpg文件和xml文件没有对齐 usr bin python3 coding UTF 8 import os import shutil file name 1 JPEGImages 图片文件存放地
  • 修改网站图标以apache tomcat为例

    路径在 opt apache tomcat 9 0 6 webapps ROOT 把该路径下的favicon ico文件换成自己的 名字必须也是要favicon ico
  • 小爱控制HA上的开关(红外线)

    小爱同学控制homeassistant in 树莓派 by 红外线 前言 租了房子以后一直想搞智能家居自动化各种事情 最近终于腾出空可以搞辣 研究了一圈感觉拆开关太麻烦了 零火线还要撬开关 租的房子不敢瞎搞 想了一下可以用arduino 树
  • [C++11]std::promise

    一 std promise介绍 std promise 是C 11并发编程中常用的一个类 常配合std future使用 其作用是在一个线程t1中保存一个类型typename T的值 可供相绑定的std future对象在另一线程t2中获取
  • 遇到的debug整理20190107

    已解决 最后的链结失败 错误的值 RT0 o relocation R X86 64 PC32 against symbol phgTetFaceVertexi can not be used when making a shared ob
  • SQL驱动下载并导入idea,idea连接数据库

    虽然是件小事 但花费了我一个小时呜呜呜呜呜 所以写个博客 希望能帮到需要的人 首先 做好准备工作 1 下载database插件 1 点击上边栏中的设置 gt 选中plogins 2 在搜索框搜索database gt 选择Database
  • github Page博客速度优化+Cloudflare_https两端配置+解决重定向次数过多问题

    网站加速调优 自从加了CDN之后我的博客偶尔会报错 重定向次数过多 症状 XXX XXX XXX 将您重定向的次数过多 尝试清除 Cookie ERR TOO MANY REDIRECTS 可能原因 参考阿里云cdn解决方案https he
  • 等响度曲线_什么是“响度”

    转自 https blog csdn net weixin 36225384 article details 112220422 原文 https www tonmeister ca wordpress 2014 06 07 bo tech
  • 解决mysql忘记密码无法登陆问题

    当我们忘记mysql密码的时候我们不仅无法访问数据库 也无法修改密码 这是个很头疼的问题 下面是跳过用户验证登陆数据库的小技巧 第一步 打开我们安装mysql的目录 复制 D PhpStudy PHPTutorial MySQL bin 地
  • 使用python进行文件夹重命名

    import os file name JPEGImages 文件存放地址 count 0 for file in os listdir file name os rename os path join file name file os
  • 用例模型与概念模型的区别和联系

    1 首先研究它究竟是什么 what 三者的定义 用例 即use case 一种描述系统需求的方法 用例建模 使用用例的方法来描述系统需求的过程 概念模型 是现实世界到机器世界的一个中间层次 2 怎样关联的 how 分析业务过程 建立用例模型
  • 安装VS2019 提示 Visual C++ 2015-2019 x64 redistributable安装失败

    最近安装VS2019和UE4的时候总是弹出提示框 忘记截图了 找了张类似的 点击OK之后会弹出下面的对话框 度娘给出茫茫多的解决方案 大部分都是说缺少vc 2015或者vc 2017的相应库 需要先安装低版本库 试了大半天都不能解决 吐血
  • javaFX用IDEA打包导出exe后图片不显示问题

    今天在用idea打包完成了JavaFX项目时 查到了两种方法 一种是用eclipse中的ant直接打包形成可安装的exe文件 见https code makery ch zh cn library javafx tutorial part7
  • fatal: unable to access ‘https://github.com/xxx‘: Failed to connect to github.com

    执行这两行命令 端口号改成自己代理服务器的端口 我的是7890 git config global https proxy 127 0 0 1 7890 git config global http proxy 127 0 0 1 7890
  • SD卡容量变小后怎么恢复

    我是因为给linux板子刷系统 所以导致SD卡内存从16G变成了40MB 恢复方法 1 win r 启动命令行 2 输入diskpart回车 运行DISKPART 3 list disk回车 列出电脑的硬盘清单 4 看看你的u盘是哪一个 选
  • Lua脚本在redis中的使用学习

    Lua脚本在redis中的使用学习 0 前言 不同于之前遇到的redisTemplate的简单set get方法 这里是使用Redis脚本执行redis操作 DefaultRedisScript

随机推荐

  • ES写入性能的提升方案

    从社区上看到一个问题 回答了一下 总结了下提高写入性能的方案 服务端 1 refresh refresh interval 1s indices memory index buffer size 10 2 translog Index tr
  • vSphere使用技巧:自定义管理规范使用

    本文转载至 http blog chinaunix net uid 21089721 id 1565198 html 一 前言 我们在使用vCenter Client的时候 常常会使用模板来安装服务器 但是这样就会带来一些问题 例如WIND
  • Windows通过某端口号找对应的进程窗口句柄

    以下为 Qt通过netstat exe程序获取相关信息 通过端口号获取进程ID 的姊妹篇 通过端口号找对应的窗口句柄 以上所提及的API 均为Win32的系统API 不涉及Qt的相关方法
  • Shell Sort 希尔排序

    希尔排序 Shell Sort 又叫做缩小增量排序 diminishing increment sort 是一种很优秀的排序法 算法本身不难理解 也很容易实现 而且它的速度很快 插入排序 Insertion Sort 的一个重要的特点是 如
  • Oracle中没有 if exists(...)

    对于Oracle中没有 if exists 的语法 目前有许多种解决方法 这里先分析常用的三种 推荐使用最后一种 第一种是最常用的 判断count 的值是否为零 如下 declare v cnt number begin select co
  • 如何搭建自己的服务器机房

    1 地下室这种环境 铲成毛坯先做一遍防水防潮抗震套餐 这个便宜 相对 2 找国家电网拉两个不一样变电站的电线杆子来做380V 之前做过一个机房的这种需求 也就二百来万吧 3 每个运营商 不同机房 做两个方向两个井 两条8 16芯缆 运营商大
  • HTML5 详细介绍 及应用实例

    HTML5 概况 什么是 HTML5 HTML 5有两大特点 首先 强化了 Web 网页的表现性能 其次 追加了本地数据库等 Web 应用的功能 HTML 5是近十年来Web开发标准最巨大的飞跃 和以前的版本不同 HTML 5并非仅仅用来表
  • [MySQL]事务ACID详解

    专栏简介 MySql数据库从入门到进阶 题目来源 leetcode 牛客 剑指offer 创作目标 记录学习MySql学习历程 希望在提升自己的同时 帮助他人 与大家一起共同进步 互相成长 学历代表过去 能力代表现在 学习能力代表未来 目录
  • 版本管理工具——SVN

    SVN的下载和安装 1 1SVN服务器端的安装和配置 1 2SVN客户端的安装和配置 SVN的基本操作 SVN的常见问题 3 1解决文件提交冲突 一 SVN服务器端的安装和配置 1 VisualSVN下载 http www visualsv
  • 国内及Github优秀开发人员列表

    自从入了Android软件开发的行道 解决问题和学习过程中免不了会参考别人的思路 浏览博文和门户网站成了最大的入口 下面这些列表取名为 国内及Github优秀开发人员列表 就是浏览后的成果 虽然下述列表出自Android软件开发 文章定为不
  • python科研项目_通过科研人员论文项目等数据,训练识别导师/学生的分类器

    student and teacher classifier 通过科研人员论文项目等数据 训练识别导师 学生的分类器 代码包括特征选择基础 网格搜索确定特征选择方法参数 不平衡数据的处理 oversampling和undersampling
  • -day18面向对象进阶

    day18 面向对象进阶 课程目标 掌握面向对象进阶相关知识点 能更加自如的使用面向对象来进行编程 今日概要 成员 变量 实例变量 类变量 方法 绑定方法 类方法 静态方法 属性 成员修饰符 公有 私有 对象嵌套 特殊成员 对比 问题 洗衣
  • mysql group by 中文_MySQL GROUP BY 语句

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组 在分组的列上我们可以使用 COUNT SUM AVG 等函数 GROUP BY 语法 SELECT column name function col
  • 单片机学习 1-LED灯的点亮(全操作)

    LED灯 P0 P1 P2 P3结构图 除了P0端口需要自己外接上拉电阻 否则只能输入输出低电平 其它自带上拉电阻 因此都可以实现高低电平的输入输出 LED灯介绍 LED灯本质是发光二极管 单片机输入电流控制在3mA 20mA之间 可串联电
  • ubuntu pycharm 无法输入中文

    很多人反馈是和ubuntu20 04有关 但是其实应该是和pycharm20 2 3有关 只需要替换掉版本里面的jbr即可 1 下载jbr https confluence jetbrains com pages viewpage acti
  • 数组-第三大的数

    题意 给定一个非空数组 返回此数组中第三大的数 如果不存在 则返回数组中最大的数 要求算法时间复杂度必须是O n 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释 第三大的数不存在 所以返
  • 笔记本电脑运行特别慢怎么解决

    其实不管是笔记本电脑还是台式电脑 用久了肯定多多少少都会有点卡顿的情况出现 很多人的笔记本就是用久了就有这种情况 面对这种情况 如果大家想快速的解决问题 就一起学学今天的关于笔记本电脑运行特别慢怎么解决的内容吧 工具 原料 系统版本 win
  • 操作系统fork()进程

    1 fork 是创建进程函数 2 c程序一开始 就会产生 一个进程 当这个进程执行到fork 的时候 会创建一个子进程 3 此时父进程和子进程是共存的 它们俩会一起向下执行c程序的代码 4 需要注意 子进程创建成功后 fork是返回两个值
  • C语言—星空&下雪特效(Easyx)

    目录 实现效果如图 01 星空 静态 02 下雪 动态 实现效果如图 01 星空 静态 include
  • [C++11]std::promise

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