C++future promise
A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads.
provider比较抽象,可以是函数可以是类,是别人提供好的东西
A promise is an object that can store a value of type T to be retrieved by a future object (possibly in another thread), offering a synchronization point.
future用于访问异步操作结果
std::async可以异步执行函数,可能是放到另一个线程去执行,返回值是一个future类型
std::promise用于线程同步的工具,储存一些数据,供future获取,协程在运行得到结果后也会将结果写入promise供获取
以async为例
代码来源
#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, 6666661);
// 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 << "\n6666661 " << (x ? "is" : "is not") << " prime.\n";
return 0;
}
后面C++20里的协程我猜应该是基于此实现的,理解一下有好处
这里放一下官方promise的代码
#include <iostream> // std::cout
#include <functional> // std::ref
#include <thread> // std::thread
#include <future> // std::promise, std::future
void print_int (std::future<int>& fut) {
int x = fut.get();//获取异步执行结果
std::cout << "value: " << x << '\n';
}
int main ()
{
std::promise<int> prom; // create promise
std::future<int> fut = prom.get_future(); // engagement with future
std::thread th1 (print_int, std::ref(fut)); // send future to new thread
prom.set_value (10); // 模拟fulfill promise
// (synchronizes with getting the future)
th1.join();
return 0;
}
C++future promise的更多相关文章
- folly教程系列之:future/promise
attension:本文严禁转载. 一.前言 promise/future是一个非常重要的异步编程模型,它可以让我们摆脱传统的回调陷阱,从而使用更加优雅.清晰的方式进行异步编程.c++11中 ...
- Future Promise 模式(netty源码9)
netty源码死磕9 Future Promise 模式详解 1. Future/Promise 模式 1.1. ChannelFuture的由来 由于Netty中的Handler 处理都是异步IO ...
- clojure的delay future promise
<Clojure编程>第4章笔记. 总的感觉,Clojure毕竟是基于JVM的在人间的工程化语言.不是纯的无状态纯函数的在神间的lisp. 作为后端语言,不可避免要处理计算中和代码执行时序 ...
- based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较 gevent不是异步 协程原理 占位符 placeholder (Future, Promise, Deferred) 循环引擎 greenlet 没有显式调度的微线程,换言之 协程
gevent GitHub - gevent/gevent: Coroutine-based concurrency library for Python https://github.com/gev ...
- 使用 Vert.X Future/Promise 编写异步代码
Future 和 Promise 是 Vert.X 4.0中的重要角色,贯穿了整个 Vert.X 框架.掌握 Future/Promise 的用法,是用好 Vert.X.编写高质量异步代码的基础.本文 ...
- The promises and challenges of std::async task-based parallelism in C++11 C++11 std::async/future/promise
转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism- ...
- Future与Promise
https://code.csdn.NET/DOC_Scala/chinese_scala_offical_document/file/Futures-and-Promises-cn.md#ancho ...
- 并发编程(三)Promise, Future 和 Callback
并发编程(三)Promise, Future 和 Callback 异步操作的有两个经典接口:Future 和 Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这 ...
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- 带callback的future实现
jdk暂时不支持,所以只有自己实现带callback的future. 完成后callback的 final TaskPromise promise = new DefaultTaskPromise() ...
随机推荐
- HashMap排序题
HashMap排序题 题目 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性. 请写一个方法实现对HashMap ...
- 最全面 think php 实现微信公众号回复编号进行投票,自定义菜单功能
前期准备工作 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messag ...
- 【yum】使用新的centos 6.9系统时,遇到的Yum问题
1,不识别域名 vi /etc/yum.conf 新增: nameserver 1.1.1.1(根据实际配置) 2,Header V3 RSA/SHA256 Signature, key ID 060 ...
- 八、常用Api
Object 深拷贝和浅拷贝 Objects 包装类 StringBuilder StringJoin Math System RuntimeBigDecimal Date SImpleDateFor ...
- 关于JWT中RSA数据加密协议在.net中应用
加密协议有哪些 加密协议分为对称加密和非对称加密. 对称加密就是将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密. 非对称加密,又称公开密钥加密,是加密和解密使用不同密钥的算法,广 ...
- Dockerfile启动镜像报错 invalid reference format: repository name must be lowercase
具体报错信息如下: "user-0.0.1-SNAPSHOT.jar:latest" for "-t, --tag" flag: invalid referen ...
- 冒泡排序快速排序C语言
//冒泡排序 void BubbleSort(ElemType A[], int n) { int i, j, temp; int flag=1; for (i = 1; i <= n - 1& ...
- uni-app学习笔记之----不同平台,独立设置
(不断补充中...) 1.导航栏 2.条件编译 不同的条件标记,会被编译到不同的平台 开头:[#ifdef]或[#ifndef] + 平台名称 结尾:[#endif] html中: js中: css中 ...
- PowerShell Regex
PowerShell默认按每一行遍历去匹配模式 比如"aaa`nbbb"用"a.*b"是匹配不到的 需要用"(?s)a.*b"来匹配 1. ...
- 51电子-STC89C51开发板:回忆
全部内容,请点击: 51电子-STC89C51开发板:<目录> --------------------------- 正文开始 --------------------------- ...