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 使用演示

 

posted @ 2020-04-08 23:36  warnet  阅读(2815)  评论(0编辑  收藏  举报