一般人可能都知道C++異步操作有async這個東西。但不知道大家是否注意過,其實(shí)它有兩個坑:
- 它不一定真的會異步執(zhí)行
- 它有可能會阻塞
下面是async具體的介紹:
async是比future,packaged_task,promise更高級的東西,它是基于任務(wù)的異步操作。
通過async可以直接創(chuàng)建異步的任務(wù),返回的結(jié)果會保存在future中,不需要像packaged_task和promise那么麻煩。
關(guān)于線程操作可以優(yōu)先使用async,看一段使用代碼:
#include
#include
#include
#include
using namespace std;
int func(int in) { return in + 1; }
int main() {
auto res = std::async(func, 5);
// res.wait();
cout << res.get() << endl; // 阻塞直到函數(shù)返回
return 0;
}
使用async異步執(zhí)行函數(shù)是不是方便多啦。
async具體語法如下:
async(std::launch::async | std::launch::deferred, func, args...);
第一個參數(shù)是創(chuàng)建策略:
- std::launch::async表示任務(wù)執(zhí)行在另一線程
- std::launch::deferred表示延遲執(zhí)行任務(wù),調(diào)用get或者wait時才會執(zhí)行,不會創(chuàng)建線程,惰性執(zhí)行在當(dāng)前線程。
如果不明確指定創(chuàng)建策略,以上兩個都不是async的默認(rèn)策略,而是undefined,它是一個基于任務(wù)的程序設(shè)計(jì),內(nèi)部有一個調(diào)度器(線程池),會根據(jù)實(shí)際情況決定采用哪種策略。
若從 std::async 獲得的 std::future 未被移動或綁定到引用,則在完整表達(dá)式結(jié)尾。
注意:std::future的析構(gòu)函數(shù)將阻塞直至異步計(jì)算完成,實(shí)際上相當(dāng)于同步操作:
std::async(std::launch::async, []{ f(); }); // 臨時量的析構(gòu)函數(shù)等待 f()
std::async(std::launch::async, []{ g(); }); // f() 完成前不開始
注意:關(guān)于async啟動策略這里網(wǎng)上和各種書籍介紹的五花八門,這里會以cppreference為主。
有時候我們?nèi)绻胝嬲龍?zhí)行異步操作可以對async進(jìn)行封裝,強(qiáng)制使用std::launch::async策略來調(diào)用async。
template <typename F, typename... Args>
inline auto ReallyAsync(F&& f, Args&&... params) {
return std::async(std::launch::async, std::forward(f), std::forward(params)...);
}
https://en.cppreference.com/w/cpp/thread/async
打完收工。
-
操作
+關(guān)注
關(guān)注
0文章
43瀏覽量
18854 -
C++
+關(guān)注
關(guān)注
22文章
2104瀏覽量
73498
發(fā)布評論請先 登錄
相關(guān)推薦
評論