c++ 11 中 异步编程提供了很多新接口,大大简化了学习和使用成本,但是对应的,也引入了更多的基础概念。仔细理解这些概念,以及他们使用的场景,api中各个参数的含义,对于正确使用接口至关重要。
- std::future
1.1 wait
1.2 wait_for
1.3 get
-
std::promise
-
std::packaged_task
-
std::async
-
他们之间的关系可以用几句话简单的描述为:
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.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 使用演示
原文链接: https://www.cnblogs.com/warnet/p/12663894.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/195551
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!