C++11併發程式設計:async,future,packaged_task,promise

蝸牛201發表於2018-12-12

一:async

std::async:用於建立非同步任務,可以代替建立執行緒,函式原型:
async(std::launch::async | std::launch::deferred, f, args...),第一個引數是建立策略
std::launch::async:立即建立執行緒
std::launch::deferred:延遲載入方式建立,知道呼叫future的get或者wait時才建立執行緒

1 int fun4()
2 {
3     cout << "thread id :" << this_thread::get_id() << endl;
4     std::this_thread::sleep_for(std::chrono::seconds(5));
5     return 1;
6 }
7 
8 std::async(fun4);

二:future

std::future:提供了一種訪問非同步操作結果機制,從非同步任務中獲取結果。

獲取future結果:
1.future.get(),等待非同步執行結束獲取返回結果,只能呼叫一次
2.future.wait(),等待非同步執行完成,無返回值。
3.future.wait_for(),超時等待返回結果,返回std::future_status狀態

future_status有三種狀態:
1.deferred:非同步等待狀態
2.ready: 非同步已完成狀態
3.timeout: 非同步超時狀態

 1     std::future_status status = future.wait_for(std::chrono::seconds(5));
 2     if (status == std::future_status::ready)
 3     {
 4         std::cout << "task is ready" << endl;
 5     }
 6     else if(status == std::future_status::timeout)
 7     {
 8         std::cout << "task is timeout" << endl;
 9     }
10     else if (status == std::future_status::deferred)
11     {
12         std::cout << "task is deferred" << endl;
13     }

三:packaged_task

packaged_task可以包裝一個可呼叫的物件,可以通過非同步獲取呼叫物件的結果,返回結果傳遞給關聯的std::future物件。

 1 int fun1(int a)
 2 {
 3     std::this_thread::sleep_for(std::chrono::seconds(5));
 4     return 10*a;
 5 }
 6 
 7 int main()
 8 {
 9     //宣告一個packaged_task物件
10     std::packaged_task<int(int)> pt1(fun1);
11     //packaged_task與future關聯
12     std::future<int> fut1 = pt1.get_future();
13 
14     //建立一執行緒,把pt1值傳入執行
15     thread t1(std::move(pt1), 10);
16 
17     //阻塞獲取執行結果
18     cout << fut1.get() << endl; //注意只能get獲取一次
19 
20     return 1;
21 }

四:promise

promise可以儲存一個值,並可以通過future來讀取,比如一個執行緒把值放入promise中,另一個執行緒可以通過get_future來獲取future,再進行get獲取該值。是一種執行緒同步的手段。

#include <iostream>
#include <thread>
#include <mutex>
#include <future>

//宣告一個promise物件,用於存放整形值
std::promise<int> prom;

int fun1()
{
    std::this_thread::sleep_for(std::chrono::seconds(5));
    prom.set_value(10);
    return 10;
}

void fun2(std::future<int> &fut)
{
    cout << "執行緒1的值:" << fut.get() << endl;
    return 1;
}

int main()
{
    thread t1(fun1);
    t1.join();

    //promise與future關聯
    std::future<int> fut = prom.get_future();
    //引用傳遞future
    thread t2(fun2, std::ref(fut));
    t2.join();
    return 1;
}

掃碼關注公眾號

專注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分散式,高併發,設計模式,爬蟲,docker,shell程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。

相關文章