当前位置: 首页 > news >正文

C++中的future和promise使用方法

future和promise

C++11中std::future提供了一种访问异步操作结果的机制。异步操作不能马上就获取操作结果,只能在未来某个时候获取,但可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异步操作的结果。
std::promise 对象可以保存某一类型 T 的值,该值可被 future 对象读取(可能在另外一个线程中),因此 promise 也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。可以通过 get_future 来获取与该 promise 对象相关联的 future 对象,调用该函数之后,两个对象共享相同的共享状态(shared state)。

  • deferred:异步操作还没开始
  • ready:异步操作已经完成
  • timeout:异步操作超时
  1. future函数:
    **get():**获取future所得到的结果,如果异步操作还没有结束,那么会在此等待异步操作的结束,并获取返回的结果。
    **wait()😗*等待异步操作的结束状态变为ready,不能获得返回结果。
    **wait_for(timeout)😗*等待timeout时间后返回结果,如果超时返回状态status=timeout。
  2. promise函数
    set_value():设置共享状态的值,此后 promise 的共享状态标志变为 ready
    get_future:获取与promise对象关联的对象
    set_exception:为promise设置异常,此后promise的共享状态标识变为ready
    set_value_at_thread_exit :在线程退出时该 promise 对象会自动设置为 ready(注意:该线程已设置promise的值,如果在线程结束之后有其他修改共享状态值的操作,会抛出future_error(promise_already_satisfied)异常)
    swap:交换 promise 的共享状态
    使用示例:

```cpp
include <iostream>
#include <future>
#include <thread>
#include <unistd.h>
#include<chrono>
void set_promise(std::promise<int>& p) {std::cout << "set_promise begin." << std::endl;sleep(5);p.set_value(100); std::cout << "set_promise end." << std::endl;
}int main() {std::promise<int> p;// 将promise和future绑定,这一步就是允诺future,未来会有人对promise赋值std::future<int> f = p.get_future();std::thread t(&set_promise, std::ref(p));std::cout<<"wait ready111:" << std::endl;auto status = f.wait_for(std::chrono::milliseconds(1000));//等待1s,结束等待时状态未改变,返回值为timeoutstd::cout<<"wait ready222:" << static_cast<int>(status) <<std::endl;status = f.wait_for(std::chrono::milliseconds(5000));//等待5s,结束等待时,状态已经变为readystd::cout<<"wait ready333:" << static_cast<int>(status) <<std::endl;std::cout << f.get() << std::endl;    // 通过get 拿到promise set的value
t.join();
return 0;
}
参考文章:
https://blog.csdn.net/whl0071/article/details/126251922
https://zhuanlan.zhihu.com/p/448035015
http://www.lryc.cn/news/42024.html

相关文章:

  • Vue项目创建
  • 2 Vue组件化编程
  • 使用GPT-4生成QT代码
  • Golang每日一练(leetDay0013)
  • 7个Python中的隐藏小技巧分享
  • 学习系统编程No.8【bash实现】
  • 2023年顶级编程语言趋势
  • 网络安全之认识勒索病毒
  • C语言手撕一个Hash表(HashTable)
  • 代码随想录第二十七天(669、108、538、回溯算法介绍)
  • 【Leetcode】设计循环队列
  • 【Linux】浅谈shell命令以及运行原理
  • 【shell脚本】nginx服务管理及存活检测脚本实战
  • web服务器—nginx
  • 网络安全工具大合集
  • 什么是SHA256?比特币是如何应用SHA256算法的?
  • JDK20正式发布了GA版本,短期维护支持,以及JDK21预览
  • .NET/C#/GC与内存管理(含深度解析)
  • Java开发 | 内部类 | 静态内部类 | 非静态内部类 | 匿名内部类
  • Portal认证
  • 论文解读:ChangeFormer | A TRANSFORMER-BASED SIAMESE NETWORK FOR CHANGE DETECTION
  • Redis 内存优化技巧
  • 【java】笔试强训Day2【​倒置字符串​与排序子序列】
  • 【Linux】基础IO(一) :文件描述符,文件流指针,重定向
  • 【C语言】通讯录的实现(静态版)
  • IDEA一键构建Docker镜像
  • QT的使用3:鼠标事件
  • 线程安全之单例模式
  • “二分”带来“十分”快感——二分思想的奥秘解析
  • 一台服务器最大能支持多少条 TCP 连接?问倒一大片。。。