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