一: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程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。