C++并发编程之std::future
简单地说,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相关推荐
- C++并发编程之std::async(), std::future, std::promise, std::packaged_task
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...
- cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用
原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...
- java线程安全的set_Java并发编程之set集合的线程安全类你知道吗
Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥并发编程学习>系列之<并发集合系列& ...
- zbb20180929 thread java并发编程之Condition
java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...
- python电路模型编程_14、python开发之路-并发编程之I/O模型
十四.并发编程之I/O模型 http://www.cnblogs.com/linhaifeng/articles/7454717.html 1.模型介绍 1.1 IO种类 (1)* blocking ...
- java并发编程之4——Java锁分解锁分段技术
转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...
- java 时间戳_Java并发编程之CAS三CAS的缺点 及解决办法
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
- golang并发编程之Ticker
golang并发编程之Ticker Timer只执行一次,Ticker可以周期的执行 icker是一个定时触发的计时器 它会以一个间隔(interval)往channel发送一个事件(当前时间) 而c ...
- 并发编程之CPU缓存架构缓存一致性协议详解(二)
并发编程之CPU缓存架构&缓存一致性协议详解 CPU高速缓存(Cache Memory) CPU高速缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就 ...
最新文章
- Fork/Join框架
- Interview:算法岗位面试—上海某公司算法岗位(偏图像算法,互联网科技行业)技术面试考点之区块链的TPS等问题
- html5 canvas图片渐变
- 带有Spring的JavaFX 2
- vba ado返回集合_利用ADO,实现同一文件夹下多个EXCEL工作表的数据汇总
- 《天天数学》连载30:一月三十日
- 计算机维护工作周报,运维周报怎么写呀,这一周没什么事做
- MessageDigest(加密)
- Amazon 的IoT之路
- HTML入门笔记8-上脚注和下脚注标签
- uniapp使用阿里云OSS直接上传文件
- 记录卸载h5py出现的问题
- 事件数据 - EventData
- Python_阿里云物联网_数据/图像/音频传输
- 知识共享许可 cc 协议
- Windows平台七牛批量上传工具使用教程
- SVG滤镜+阴影+渐变--学习笔记
- 【CV】CVPR2021高光谱图像重建论文笔记
- Android支持的视频格式
- Zemax---Optimization Wizard(优化向导)
热门文章
- vue中的浏览量_Laravel 5.3和vuejs实现文章浏览次数问题
- plsql表锁被占用_处理Oracle被锁住的进程
- java 二叉树的高度_最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树...
- hua图软件 mac_细数Mac上那些好用且免费的软件(四)
- Struts2反序列化漏洞复现
- Java基础-面向接口(interface)编程
- [SPOJGCJ1C09C] Bribe the Prisoners
- python操作mysql,增,删,改,查
- 特别推荐:开发者的10个最佳代码游乐场
- Use Amazon VM to try Openstack (1) (with DevStack)