一般人可能都知道C++異步操作有async這個東西。但不知道大家是否注意過,其實它有兩個坑:
- 它不一定真的會異步執行
- 它有可能會阻塞
下面是async具體的介紹:
async是比future,packaged_task,promise更高級的東西,它是基于任務的異步操作。
通過async可以直接創建異步的任務,返回的結果會保存在future中,不需要像packaged_task和promise那么麻煩。
關于線程操作可以優先使用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; // 阻塞直到函數返回
return 0;
}
使用async異步執行函數是不是方便多啦。
async具體語法如下:
async(std::launch::async | std::launch::deferred, func, args...);
第一個參數是創建策略:
- std::launch::async表示任務執行在另一線程
- std::launch::deferred表示延遲執行任務,調用get或者wait時才會執行,不會創建線程,惰性執行在當前線程。
如果不明確指定創建策略,以上兩個都不是async的默認策略,而是undefined,它是一個基于任務的程序設計,內部有一個調度器(線程池),會根據實際情況決定采用哪種策略。
若從 std::async 獲得的 std::future 未被移動或綁定到引用,則在完整表達式結尾。
注意:std::future的析構函數將阻塞直至異步計算完成,實際上相當于同步操作:
std::async(std::launch::async, []{ f(); }); // 臨時量的析構函數等待 f()
std::async(std::launch::async, []{ g(); }); // f() 完成前不開始
注意:關于async啟動策略這里網上和各種書籍介紹的五花八門,這里會以cppreference為主。
有時候我們如果想真正執行異步操作可以對async進行封裝,強制使用std::launch::async策略來調用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
打完收工。
-
操作
+關注
關注
0文章
43瀏覽量
18872 -
C++
+關注
關注
22文章
2108瀏覽量
73623
發布評論請先 登錄
相關推薦
評論