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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM