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