C++11異步與通信之std::async的使用
概念簡介
std::async 異步運行一個函數(shù),將返回值保存在std::future中。
含有2個策略參數(shù):
- launch::deferred 延遲執(zhí)行,當(dāng)調(diào)用wait()和get()時,任務(wù)才會被運行,且不創(chuàng)建線程;
- launch::async : 創(chuàng)建線程并執(zhí)行任務(wù),默認(rèn)是此類型;
- 同樣的,調(diào)用get()方法獲取對象時,也是阻塞等待的。
代碼示例
使用deferred策略
int Func()
{
? ? std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
? ? return 0;
}
int main()
{ ??
? ? std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
? ? //創(chuàng)建延遲任務(wù),這里不會啟動新線程
? ? auto future = std::async(std::launch::deferred, Func);
? ? //調(diào)用future.get()時,才會去調(diào)用Func?
? ? //讀者可以試著把這行代碼注釋掉,你會發(fā)現(xiàn)Func函數(shù)根本沒有創(chuàng)建
? ? std::cout << "Result = ?" << future.get() << std::endl;;
? ? //通過打印線程id我們發(fā)現(xiàn),是在同一個線程中執(zhí)行的,沒有創(chuàng)建新線程
? ? return 0;
}執(zhí)行結(jié)果
Main Thread id = 140646835402560
Result = Func Thread id = 140646835402560
0
使用async策略
int Func(int n)
{
? ? std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
? ? return -1;
}
int main()
{ ??
? ? std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
? ? //創(chuàng)建異步任務(wù) 使用默認(rèn)策略 ?啟動一個新線程
? ? //并且馬上會執(zhí)行異步任務(wù)代碼
? ? auto future = std::async(std::launch::async, Func, 100);
? ? //通過睡眠發(fā)現(xiàn),get()調(diào)用之前,任務(wù)已經(jīng)在被執(zhí)行了
? ? std::this_thread::sleep_for(std::chrono::seconds(5));
? ? std::cout << "Result = ?" << future.get() << std::endl;;
? ? //通過打印線程id我們發(fā)現(xiàn),不是在同一個線程中執(zhí)行的,創(chuàng)建了新線程
? ? return 0;
}運行結(jié)果:
Main Thread id = 140052716861248
Func Thread id = 140052716857088
Result = -1
補充
與std::packaged_task相比,std::async不僅可以打包一個異步任務(wù),std::launch::async策略下還可以幫忙創(chuàng)建一個新線程并執(zhí)行任務(wù),某些場景下比std::packaged_task方便一些。
到此這篇關(guān)于C++11異步與通信之std::async的使用的文章就介紹到這了,更多相關(guān)C++11 std::async內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中map和vector作形參時如何給定默認(rèn)參數(shù)?
今天小編就為大家分享一篇關(guān)于C++中map和vector作形參時如何給定默認(rèn)參數(shù)?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
C語言關(guān)鍵字const和指針的結(jié)合使用
這篇文章主要介紹了C語言關(guān)鍵字const和指針的結(jié)合,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
編譯錯誤error: stray ‘\343’in program的解決方法
以下是對編譯錯誤error: stray ‘\343’in program的解決方法進行了詳細(xì)的分析介紹,如遇此問題的朋友們可以過來參考下2013-07-07
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對這些方法進行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08

