0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

async的兩個(gè)坑

汽車電子技術(shù) ? 來源:程序喵大人 ? 作者:程序喵 ? 2023-02-21 14:01 ? 次閱讀

一般人可能都知道C++異步操作有async這個(gè)東西。但不知道大家是否注意過,其實(shí)它有兩個(gè)坑:

  1. 它不一定真的會異步執(zhí)行
  2. 它有可能會阻塞

下面是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...);

第一個(gè)參數(shù)是創(chuàng)建策略:

  • std::launch::async表示任務(wù)執(zhí)行在另一線程
  • std::launch::deferred表示延遲執(zhí)行任務(wù),調(diào)用get或者wait時(shí)才會執(zhí)行,不會創(chuàng)建線程,惰性執(zhí)行在當(dāng)前線程。

如果不明確指定創(chuàng)建策略,以上兩個(gè)都不是async的默認(rèn)策略,而是undefined,它是一個(gè)基于任務(wù)的程序設(shè)計(jì),內(nèi)部有一個(gè)調(diào)度器(線程池),會根據(jù)實(shí)際情況決定采用哪種策略。

若從 std::async 獲得的 std::future 未被移動(dòng)或綁定到引用,則在完整表達(dá)式結(jié)尾。

注意:std::future的析構(gòu)函數(shù)將阻塞直至異步計(jì)算完成,實(shí)際上相當(dāng)于同步操作:

std::async(std::launch::async, []{ f(); }); // 臨時(shí)量的析構(gòu)函數(shù)等待 f()
std::async(std::launch::async, []{ g(); }); // f() 完成前不開始

注意:關(guān)于async啟動(dòng)策略這里網(wǎng)上和各種書籍介紹的五花八門,這里會以cppreference為主。

有時(shí)候我們?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

打完收工。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 操作
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    18819
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73302
收藏 人收藏

    評論

    相關(guān)推薦

    PCB板返修時(shí)的兩個(gè)關(guān)鍵工藝

    . 引言   對于成功返修SMT起幫助作用的兩個(gè)最關(guān)鍵工藝,也是兩個(gè)
    發(fā)表于 04-16 21:33 ?1997次閱讀

    兩個(gè)分機(jī)的對講電話

    兩個(gè)分機(jī)的對講電話
    發(fā)表于 05-01 01:07 ?1168次閱讀
    有<b class='flag-5'>兩個(gè)</b>分機(jī)的對講電話

    兩個(gè)可變零點(diǎn)、兩個(gè)固定極點(diǎn)的有源濾波器

    兩個(gè)可變零點(diǎn)、兩個(gè)固定極點(diǎn)的有源濾波器
    發(fā)表于 04-15 10:51 ?567次閱讀
    有<b class='flag-5'>兩個(gè)</b>可變零點(diǎn)、<b class='flag-5'>兩個(gè)</b>固定極點(diǎn)的有源濾波器

    兩個(gè)實(shí)用的串口調(diào)試助手

    電子發(fā)燒友網(wǎng)站提供《兩個(gè)實(shí)用的串口調(diào)試助手.zip》資料免費(fèi)下載
    發(fā)表于 07-22 15:22 ?8次下載

    合并兩個(gè)排序的鏈表

    合并兩個(gè)排序的鏈表一、題目要求 輸入兩個(gè)單調(diào)遞增的鏈表,輸出兩個(gè)鏈表合成后的鏈表,當(dāng)然我們需要合成后的鏈表滿足單調(diào)不減規(guī)則。 二、我的思路 1、比較兩個(gè)鏈表的頭結(jié)點(diǎn)大小,哪個(gè)小就將其作
    發(fā)表于 01-16 22:02 ?536次閱讀

    如何測量兩個(gè)光源的相對強(qiáng)度?

    Q: 是否可以使用儀表放大器測量兩個(gè)光源之間的差異?A: 是的,用兩個(gè)光敏電阻替換儀表放大器的主設(shè)定電阻就可
    的頭像 發(fā)表于 02-03 12:45 ?5786次閱讀
    如何測量<b class='flag-5'>兩個(gè)</b>光源的相對強(qiáng)度?

    兩個(gè)電機(jī)的電路開源

    電子發(fā)燒友網(wǎng)站提供《兩個(gè)電機(jī)的電路開源.zip》資料免費(fèi)下載
    發(fā)表于 08-03 11:20 ?1次下載
    <b class='flag-5'>兩個(gè)</b>電機(jī)的電路開源

    async-backtrace使用步驟

    使用 #[async_backtrace::framed] 標(biāo)注一個(gè)異步函數(shù)可用于追蹤,使用 taskdump_tree 以樹的形式輸出當(dāng)前所有被追蹤的任務(wù)狀態(tài)
    的頭像 發(fā)表于 11-02 09:38 ?466次閱讀
    <b class='flag-5'>async</b>-backtrace使用步驟

    如何控制兩個(gè)電機(jī)直流

    電子發(fā)燒友網(wǎng)站提供《如何控制兩個(gè)電機(jī)直流.zip》資料免費(fèi)下載
    發(fā)表于 11-21 14:35 ?0次下載
    如何控制<b class='flag-5'>兩個(gè)</b>電機(jī)直流

    在trait中使用 `async fn`

    在 trait 中使用?async fn async 工作組很高興地宣布?async fn?現(xiàn)在可以在 nightly 版本的 traits 中使用。在 playground 上有一個(gè)
    的頭像 發(fā)表于 11-23 15:40 ?688次閱讀

    分享兩個(gè)STM32應(yīng)用中的實(shí)戰(zhàn)案例

    今天在此分享兩個(gè)STM32應(yīng)用中的實(shí)戰(zhàn)案例,權(quán)作提醒,以免重蹈覆轍。
    的頭像 發(fā)表于 01-11 09:13 ?3206次閱讀

    如何使用兩個(gè)LED和Arduino

    電子發(fā)燒友網(wǎng)站提供《如何使用兩個(gè)LED和Arduino.zip》資料免費(fèi)下載
    發(fā)表于 01-30 11:28 ?1次下載
    如何使用<b class='flag-5'>兩個(gè)</b>LED和Arduino

    兩個(gè)LED和兩個(gè)按鈕的使用

    電子發(fā)燒友網(wǎng)站提供《兩個(gè)LED和兩個(gè)按鈕的使用.zip》資料免費(fèi)下載
    發(fā)表于 01-30 16:04 ?1次下載
    <b class='flag-5'>兩個(gè)</b>LED和<b class='flag-5'>兩個(gè)</b>按鈕的使用

    如何判斷兩個(gè)鏈表是否相交,假設(shè)兩個(gè)鏈表都沒有環(huán)?

    首先,很多同學(xué)會存在一個(gè)誤區(qū),認(rèn)為兩個(gè)鏈表相交應(yīng)該這樣的。
    的頭像 發(fā)表于 08-08 17:08 ?867次閱讀
    如何判斷<b class='flag-5'>兩個(gè)</b>鏈表是否相交,假設(shè)<b class='flag-5'>兩個(gè)</b>鏈表都沒有環(huán)?

    兩個(gè)硬盤2個(gè)系統(tǒng)開機(jī)切換

    切換兩個(gè)硬盤上的系統(tǒng)是一種常見的行為,可以讓用戶在不同的操作系統(tǒng)之間進(jìn)行切換,以滿足不同的需求。在本文中,我們將詳細(xì)介紹如何配置和使用兩個(gè)硬盤上的系統(tǒng)進(jìn)行切換。本文將分為以下幾個(gè)部分進(jìn)行討論:硬件
    的頭像 發(fā)表于 11-28 15:08 ?6003次閱讀