简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值,如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值(此时共享状态的标志变为 ready),std::future::get 返回异步任务的值或异常(如果发生了异常)。

一个有效(valid)的 std::future 对象通常由以下三种 Provider 创建,并和某个共享状态相关联。Provider 可以是函数或者类,其实我们前面都已经提到了,他们分别是:

  • std::async 函数。
  • std::promise::get_future,get_future 为 promise 类的成员函数。
  • std::packaged_task::get_future,此时 get_future为 packaged_task 的成员函数。

一个 std::future 对象只有在有效(valid)的情况下才有用(useful),由 std::future 默认构造函数创建的 future 对象不是有效的(除非当前非有效的 future 对象被 move 赋值另一个有效的 future 对象)。

在一个有效的 future 对象上调用 get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值或异常(此时共享状态的标志变为 ready),std::future::get 将返回异步任务的值或异常(如果发生了异常)。

// future example
#include <iostream>             // std::cout
#include <future>               // std::async, std::future
#include <chrono>               // std::chrono::milliseconds// a non-optimized way of checking for prime numbers:
bool is_prime(int x)
{for (int i = 2; i < x; ++i)if (x % i == 0)return false;return true;
}int main()
{// call function asynchronously:std::future < bool > fut = std::async(is_prime, 444444443);// do something while waiting for function to set future:std::cout << "checking, please wait";std::chrono::milliseconds span(100);while (fut.wait_for(span) == std::future_status::timeout)std::cout << '.';bool x = fut.get();         // retrieve return value
std::cout << "\n444444443 " << (x ? "is" : "is not") << " prime.\n";return 0;
}

转载于:https://www.cnblogs.com/zhanghu52030/p/9522287.html

C++并发编程之std::future相关推荐

  1. C++并发编程之std::async(), std::future, std::promise, std::packaged_task

    c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...

  2. cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

    原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...

  3. java线程安全的set_Java并发编程之set集合的线程安全类你知道吗

    Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥并发编程学习>系列之<并发集合系列& ...

  4. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  5. python电路模型编程_14、python开发之路-并发编程之I/O模型

    十四.并发编程之I/O模型 http://www.cnblogs.com/linhaifeng/articles/7454717.html 1.模型介绍 1.1 IO种类 (1)* blocking ...

  6. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  7. java 时间戳_Java并发编程之CAS三CAS的缺点 及解决办法

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  8. golang并发编程之Ticker

    golang并发编程之Ticker Timer只执行一次,Ticker可以周期的执行 icker是一个定时触发的计时器 它会以一个间隔(interval)往channel发送一个事件(当前时间) 而c ...

  9. 并发编程之CPU缓存架构缓存一致性协议详解(二)

    并发编程之CPU缓存架构&缓存一致性协议详解 CPU高速缓存(Cache Memory) CPU高速缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就 ...

最新文章

  1. Fork/Join框架
  2. Interview:算法岗位面试—上海某公司算法岗位(偏图像算法,互联网科技行业)技术面试考点之区块链的TPS等问题
  3. html5 canvas图片渐变
  4. 带有Spring的JavaFX 2
  5. vba ado返回集合_利用ADO,实现同一文件夹下多个EXCEL工作表的数据汇总
  6. 《天天数学》连载30:一月三十日
  7. 计算机维护工作周报,运维周报怎么写呀,这一周没什么事做
  8. MessageDigest(加密)
  9. Amazon 的IoT之路
  10. HTML入门笔记8-上脚注和下脚注标签
  11. uniapp使用阿里云OSS直接上传文件
  12. 记录卸载h5py出现的问题
  13. 事件数据 - EventData
  14. Python_阿里云物联网_数据/图像/音频传输
  15. 知识共享许可 cc 协议
  16. Windows平台七牛批量上传工具使用教程
  17. SVG滤镜+阴影+渐变--学习笔记
  18. 【CV】CVPR2021高光谱图像重建论文笔记
  19. Android支持的视频格式
  20. Zemax---Optimization Wizard(优化向导)

热门文章

  1. vue中的浏览量_Laravel 5.3和vuejs实现文章浏览次数问题
  2. plsql表锁被占用_处理Oracle被锁住的进程
  3. java 二叉树的高度_最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树...
  4. hua图软件 mac_细数Mac上那些好用且免费的软件(四)
  5. Struts2反序列化漏洞复现
  6. Java基础-面向接口(interface)编程
  7. [SPOJGCJ1C09C] Bribe the Prisoners
  8. python操作mysql,增,删,改,查
  9. 特别推荐:开发者的10个最佳代码游乐场
  10. Use Amazon VM to try Openstack (1) (with DevStack)