广告位联系
返回顶部
分享到

C++11之std::future对象的使用以及说明

C语言 来源:互联网 作者:佚名 发布时间:2023-02-28 22:29:19 人浏览
摘要

std::future介绍 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。 但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量;从安全角度看,有些

std::future介绍

在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。

但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量;从安全角度看,有些不妥;为此C++11提供了std::future类模板,future对象提供访问异步操作结果的机制,很轻松解决从异步任务中返回结果。

在C++标准库中,有两种“期望”

使用两种类型模板实现

  • 唯一期望(unique futures,std::future<>) std::future的实例只能与一个指定事件相关联。
  • 共享期望(shared futures)(std::shared_future<>) std::shared_future的实例就能关联多个事件。

这里主要介绍的是唯一期望,std::future类模板定义头文件<future>

其函数声明如下:

1

2

3

4

5

6

7

8

template< class T >

class future;

//数据有关的期望

template< class T >

class future<T&>;

//数据无关的期望

template<>         

class future<void>;

对于future补充说明如下:

  • std::async 、std::packaged_task 或 std::promise 能提供一个std::future对象给该异步操作的创建者
  • 异步操作的创建者能用各种方法查询、等待或从 std::future 提取值。若异步操作仍未提供值,则这些方法可能阻塞。
  • 异步操作准备好发送结果给创建者时,它能通过接口(eg,std::promise::set_value std::future) 修改共享状态的值。

其成员函数如下:

细节说明

wait系列操作

其函数声明如下:

1

void wait() const;

当共享状态值是不可以用时,调用wait接口可以一直阻塞,直到共享状态变为"就绪"时,就变为可以用了。

get操作

get是获取共享状态的结果它有以下三种形式:

1

2

3

4

5

6

//仅为泛型 future 模板的成员

T get();

//(仅为 future<T&> 模板特化的成员)

T& get();

//仅为 future<void> 模板特化的成员

void get();

如果我们没有调用wait接口,而是直接掉用get接口,它等价于先调用wait()而后在调用get接口,得到异步操作的结果。

当调用此方法后 valid() 为 false ,共享状态被释放,即future对象释一次性的事件。

时序图

按照自己的理解,将std::future对象的使用以及内部逻辑用时序图进行表达,如下:

std::future使用

下面就用std::future对象来获取异步操作的结果,没有使用到全局变量,逻辑非常清晰

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//通过async来获取异步操作结果

std::future<int>  result = std::async([](){

    std::this_thread::sleep_for(std::chrono::milliseconds(500));

    return 8;

});

 

std::cout << "the future result : " << result.get() << std::endl;

std::cout << "the future status : " << result.valid() << std::endl;

try

{

    result.wait();  //或者 result.get() ,会异常

  //因此std::future只能用于单线程中调用 ,多线程调用使用std::share_future();

}

catch (...)

{

    std::cout << "get error....\n ";

}

运行结果:


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/c_base_jin/article/details/89761718
相关文章
  • C++20中的std::span介绍
    span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。 连续的存储,不一定是数组。例如: 1 2 3 4 5 6 7 8 zero(char (arr) [10]
  • C++11之std::future对象的使用以及说明

    C++11之std::future对象的使用以及说明
    std::future介绍 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。 但是我们想要从线程中返回异步任务结果,
  • C语言中#define在多行宏定义出错的原因及分析
    C语言中#define在多行宏定义出错的原因 1.第一种错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #includestdio.h #define echange(a,b) {\/*宏定义中允许包含多行命
  • vs2022 x64 C/C++和汇编混编(案例代码)

    vs2022 x64 C/C++和汇编混编(案例代码)
    vs2022环境x64 C/C++和汇编混编 vs64位程序不支持__asm内嵌汇编,需要单独编写汇编源文件 示例如下 1、新建空的win32项目,新建main.cpp,示例代码
  • C语言中带返回值的宏定义方式
    C语言中带返回值的宏定义 相信大家在实际工作中,一定有遇到需要编写一个宏定义,且希望它能带返回值的场景吧? 比如我之前就遇到一
  • OpenCV实现视频绿幕背景替换功能
    1、概述 案例:使用OpenCV实现视频绿幕背景替换 算法步骤: 1.初始化VideoCapture并使用其open方法加载视频 2.while循环加读取frame capture.read(fra
  • OpenCV通过透视变换实现矫正图像介绍

    OpenCV通过透视变换实现矫正图像介绍
    1、概述 案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现
  • 一篇文章彻底搞懂C++常见容器

    一篇文章彻底搞懂C++常见容器
    1.概述 C++容器属于STL(标准模板库)中的一部分(六大组件之一),从字面意思理解,生活中的容器用来存放(容纳)水或者食物,东西,
  • C语言通过二分查找实现猜数字游戏

    C语言通过二分查找实现猜数字游戏
    二分查找 题目: 在一个有序数组中查找具体的某个数字n。 首先我们先定义一个110的数组 ,如果7为我们要查找的数字,编写代码如下 1 2
  • Matlab实现绘制高阶版本韦恩图(upset图)

    Matlab实现绘制高阶版本韦恩图(upset图)
    韦恩图随着阶数升高会越来越复杂,当阶数达到7或者以上时几乎没办法绘制: 但是使用upset图却可以比较轻易的绘制: 两种类型图的对应关
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计