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

c++ future 使用详解

c++ future 使用详解

std::future

  • 头文件 #include <future>

  • 类模板,定义如下:

    template<class T> class future;
    template<class T> class future<T&>;
    template<>        class future<void>;
    
  • 作用:提供了一种机制,可以获取异步任务的执行结果、等待异步任务的完成、检查异步任务的状态等操作。

  • 使用:通常情况下,与 std::async,std::promise 和 std::packaged_task 结合使用。

std::future 成员函数

  • get:获取任务的执行结果;
  • wait:等待结果变得可用;
  • wait_for:等待结果,如果在指定的超时间隔后仍然无法得到结果,则返回;
  • wait_until:等待结果,如果在已经到达指定的时间点时仍然无法得到结果,则返回。

wait_for wait_until

  • 函数原型:

    template<class Rep, class Period>
    std::future_status wait_for(const std::chrono::duration<Rep,Period>& timeout_duration) const;template<class Clock, class Duration>
    std::future_status wait_until( const std::chrono::time_point<Clock,Duration>& timeout_time) const;
    
    • timeout_duration:要阻塞的最大时长。
    • timeout_time:要阻塞到的最大时间点。
    • 返回值:std::future_status:
      • future_status::deferred:函数被延迟运行,结果将仅在调用 wait 或者 get 时进行计算;
      • future_status::ready:结果已经就绪;
      • future_status::timeout:结果经过指定的等待时间后仍未就绪;
  • 推荐使用稳定时钟,避免因系统时间调整而受到影响。

示例代码

  • 与 std::async,std::promise 和 std::packaged_task 的结合使用:

    #include <iostream>
    #include <future>
    #include <thread>int main()
    {// 来自 packaged_task 的 futurestd::packaged_task<int()> task([]() { return 100; });// 获取 futurestd::future<int> f1 = task.get_future();// 在线程上运行std::thread(std::move(task)).detach();// 来自 async 的 futurestd::future<int> f2 = std::async(std::launch::async, []() { return 200; });// 来自 promise 的 futurestd::promise<int> p;std::future<int> f3 = p.get_future();std::thread([&p] { p.set_value_at_thread_exit(300); }).detach();std::cout << "Waiting..." << std::flush;f1.wait();f2.wait();f3.wait();std::cout << "Done!\nResults are: ";std::cout << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    }
    
http://www.lryc.cn/news/228400.html

相关文章:

  • 好用的C C++ 日志宏 OutputDebugStringA 写到文件或界面
  • 如何在ModelScope社区魔搭下载所需的模型
  • NLP在网安领域中的应用(初级)
  • 03.UDP套接字与原始套接字
  • 「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式
  • Python开源项目RestoreFormer(++)——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
  • 设计模式 -- 命令模式(Command Pattern)
  • 【数据分享】2021-2023年我国主要城市逐月轨道交通运营数据
  • 大数据-之LibrA数据库系统告警处理(ALM-12034 周期备份任务失败)
  • tx-前端笔试题记录
  • 详解Redis持久化(上篇——RDB持久化)
  • 爬虫常见风控
  • 华为ensp:边缘端口并启动BUDU保护
  • 分布式id生成数据库号段算法的golang实现
  • 【算法 | 模拟No.4】AcWing 756. 蛇形矩阵 AcWing 40. 顺时针打印矩阵
  • 数据——最为直接的答案
  • php加密解密的用法(对称加密,非对称加密)
  • 优秀智慧园区案例 - 中建科技产业园(中建·光谷之星),万字长文解析先进智慧园区建设方案经验
  • Python基础详解教程------目录大纲
  • 什么是高防IP?
  • 打开word文档报错,提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0
  • Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算
  • 20 个好用的一行 Java代码
  • Java编程--单例模式(饿汉模式/懒汉模式)/阻塞队列
  • 【go-zero】go-zero 脚手架 simple-admin 第二章:通过goctls生成api整个项目
  • 小程序用户隐私设置指引
  • Docker - 容器数据卷
  • YOLOv5独家最新改进《新颖高效AsDDet检测头》VisDrone数据集mAP涨点,即插即用|检测头新颖改进,性能高效涨点
  • 第十三章 网络管理实战1
  • 警惕!.360、.halo病毒来袭,这些建议能让你的数据安如泰山!