• c++ 11 中future的一些理解


    c++ 11 中 异步编程提供了很多新接口,大大简化了学习和使用成本,但是对应的,也引入了更多的基础概念。仔细理解这些概念,以及他们使用的场景,api中各个参数的含义,对于正确使用接口至关重要。

    1. std::future

    1.1 wait

    1.2 wait_for

    1.3 get

    2. std::promise

    3. std::packaged_task

    4. std::async

    5. 他们之间的关系可以用几句话简单的描述为:

        5.0 官方的描述中,std::future std::promise 和 std::packaged_task 是 provider;

        5.1 std::promise 封装了包含了 std::future 的异步操作结果;

        5.2 std::packaged_task 封装了包含了 std::future 的异步操作对象;

        5.3 通过 std::future 可以获取异步操作的真正结果;

        5.4 通过 std::async 是对 std::promise 和 std::packaged_task 的高级封装以简化使用,第一个参数 std::launch::policy 有两种类型,这个参数指明使用thread来触发,还是延迟到wait或者get调用时才触发执行;

    6. 应用代码

        6.1 使用future来实现优雅退出线程

     1 #include <iostream>
     2 #include <thread>
     3 #include <future>
     4 #include <chrono>
     5 
     6 std::promise<int> pro;
     7 std::future<int> f = pro.get_future();
     8 
     9 void do_stuff()
    10 {
    11     while (f.wait_for(std::chrono::milliseconds(1000)) == std::future_status::timeout)
    12     // while (f.wait_for(std::chrono::milliseconds(1)) == std::future_status::timeout)
    13     {
    14         // std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    15         std::cout << "do stuff ing..." << std::endl;
    16     }
    17     std::cout << "do stuff done" << std::endl;
    18 }
    19 
    20 
    21 int main()
    22 {
    23     std::thread t(do_stuff);
    24     std::this_thread::sleep_for(std::chrono::seconds(10));
    25     pro.set_value(9);
    26     std::cout << "main done" << std::endl;
    27     t.join();
    28 
    29     return 0;
    30 }

        6.2 promise 和 packaged_task 使用演示

  • 相关阅读:
    2020.12.15
    2020.12.14
    2020.12.13
    2020.12.11
    2020.12.10
    语音合成标记语言(SSML)
    Skyline查询
    win10 VMware 安装 Linux 虚拟机
    图像梯度计算
    Harris Corner Detection
  • 原文地址:https://www.cnblogs.com/warnet/p/12663894.html
Copyright © 2020-2023  润新知