C++11之std::async

? ??????std::future<T>? async(launch __policy, _Fn&& __fn, _Args&&... __args)是一個(gè)接受回調(diào)(函數(shù)或函數(shù)對(duì)象)作為參數(shù)的函數(shù)模板,并有可能異步執(zhí)行它們。返回一個(gè)std::future<T>,它存儲(chǔ)由std::async()執(zhí)行的函數(shù)對(duì)象返回的值。

參數(shù)介紹

????????參數(shù)1: launch 啟動(dòng)策略有三種選擇

????????????????一、std::launch::async 保證異步行為,執(zhí)行后,系統(tǒng)創(chuàng)建一個(gè)線(xiàn)程執(zhí)行對(duì)應(yīng)的函數(shù)

????????????????二、std::launch::deffered 當(dāng)其他線(xiàn)程調(diào)用get()來(lái)訪問(wèn)共享狀態(tài)時(shí),將調(diào)用非異步行為

????????????????三、std::launch::async||std::launch::deffered 默認(rèn)策略,由系統(tǒng)決定怎么調(diào)用

????????參數(shù)2,3分別為函數(shù)指針(函數(shù)指針·函數(shù)對(duì)象·lambda表達(dá)式),函數(shù)參數(shù)列表。

例1.

默認(rèn)策略

????????其中wait get 函數(shù)都有等待異步線(xiàn)程結(jié)束的意思 但是get可以拿到返回的結(jié)果,如果不寫(xiě)wait 或者get 那么程序是沒(méi)有輸出的。(為什么沒(méi)有輸出是因?yàn)橄到y(tǒng)默認(rèn)選擇了defferd策略,所以沒(méi)有等待這兩個(gè)線(xiàn)程結(jié)束)

例2.

異步策略

對(duì)于異步策略,不需要wait 或者 get 來(lái)等線(xiàn)程結(jié)束,異步策略會(huì)等待線(xiàn)程結(jié)束。

例3.

延遲策略

延遲策略就必須使用 wait 或者 get 來(lái)等待線(xiàn)程結(jié)束了。

返回結(jié)果std::future

? ??????它提供了一種訪問(wèn)異步操作結(jié)果的機(jī)制。我們可以以同步等待的方式來(lái)獲取結(jié)果,可以通過(guò)查詢(xún)future的狀態(tài)(future_status)來(lái)獲取異步操作的結(jié)果。

future_status有三種狀態(tài):

? ? ????deferred:異步操作還沒(méi)開(kāi)始

? ? ????ready:異步操作已經(jīng)完成

? ? ????timeout:異步操作超時(shí)

future_status實(shí)例

結(jié)果(橫著寫(xiě)了,節(jié)省空間)timeout timeout timeout timeout timeout timeout timeout timeout timeout deferred1 ready

????????std::async是更高層次上的異步操作,我們不需要關(guān)注創(chuàng)建線(xiàn)程的細(xì)節(jié),就可以方便的獲得結(jié)果,線(xiàn)程狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容