? ??????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.
????????其中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í)
結(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)。