C++11異步編程 --- async

C++11異步編程 — async和future

C++11引入了asyncfuture機制,用于簡化異步編程和并發操作。這兩個組件位于<future>頭文件中,提供了高級的異步任務管理接口。

一、async

1.定義

std::async

std::async是一個函數模板,用于啟動一個異步任務。它返回一個std::future對象,該對象可以用來獲取異步任務的結果。std::async的執行方式可以通過std::launch策略來控制。如下:

future<int> myf = async(launch::async,Func,20,30);

2.主要功能

①啟動一個異步任務,返回一個future對象。

②啟動策略:

EXPORT_STD enum class launch { // names for launch options passed to asyncasync    = 0x1,deferred = 0x2
};

launch::async :強制在新線程中啟動異步任務。

launch::deferred:延遲執行,只有當future的get()或者wait函數被調用時,任務才會在調用線程中執行。

默認策略(不指定) - 由實現決定,可能是異步或延遲

二、future

1.定義:

future是一個類模板,用于存儲異步執行結果,它提供了一種機制,允許用戶在某個異步操作完成時獲取其結果。std::future對象可以與線程、異步任務或其他并發操作相關聯。

2.主要功能

①通過std::futureget()方法,可以獲取異步操作的結果。如果異步操作尚未完成,get()會阻塞當前線程,直到結果可用。

②它提供了以下主要方法:

  1. get() - 獲取結果(如果結果未準備好會阻塞)
  2. wait() - 等待結果可用(阻塞但不獲取結果)
  3. wait_for()/wait_until() - 帶超時的等待
  4. valid() - 檢查future是否關聯了共享狀態

三、 std::asyncstd::future的使用場景

1.異步任務處理:適用于需要在后臺執行耗時操作,而主線程可以繼續執行其他任務的場景。

2.多線程數據共享:通過std::future獲取異步任務的結果,避免了直接使用線程時可能出現的線程同步問題。

3.簡化并發編程:提供了一種簡潔的方式來實現異步任務的啟動和結果獲取,降低了并發編程的復雜性。

四、注意事項:

1.如果不保留async返回的future對象,其析構函數會阻塞等待任務完成(類似于隱式join)。

2.線程安全:std::futurestd::async是線程安全的,但用戶需要確保在使用std::futureget()方法時,不會出現對同一std::future對象的多次調用,future::get()只能調用一次,調用后future變為無效。

3.資源管理:std::future對象在析構時會自動銷毀關聯的異步任務,但如果任務尚未完成,可能會導致資源泄漏或未定義行為。

4.性能考慮:雖然std::async可以自動選擇執行策略,但在某些情況下,顯式指定std::launch::asyncstd::launch::deferred可以更好地控制任務的執行方式,從而優化性能。

示例代碼:

#include <iostream>
#include<thread>
#include<future>
using namespace std;int Func(int a,int b)
{cout << "Sub thread ID:" << this_thread::get_id() << endl;cout << "this is MyFunc" << endl;return a + b;
}int main()
{future<int> myf = async(launch::async,Func,20,30);cout <<"Main Thread Id:"<< this_thread::get_id() << endl;myf.wait();cout<<"myf == " << myf.get()<< endl; std::cout << "Hello World!\n";
}

代碼運行結果:

微信截圖_20250513231841

好了,關于async和future的介紹就到這里了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80605.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(七)深度學習---神經網絡原理與實現

分類問題回歸問題聚類問題各種復雜問題決策樹√線性回歸√K-means√神經網絡√邏輯回歸√嶺回歸密度聚類深度學習√集成學習√Lasso回歸譜聚類條件隨機場貝葉斯層次聚類隱馬爾可夫模型支持向量機高斯混合聚類LDA主題模型 一.神經網絡原理概述 二.神經網絡的訓練方法 三.基于Ker…

[Java實戰]Spring Boot 整合 Swagger2 (十六)

[Java實戰]Spring Boot 整合 Swagger2 &#xff08;十六&#xff09; 一、Swagger 的價值與痛點 為什么需要 API 文檔工具&#xff1f; 開發階段&#xff1a;前后端高效協作&#xff0c;實時驗證接口測試階段&#xff1a;提供標準化測試用例維護階段&#xff1a;降低新人理解…

系統穩定性之上線三板斧

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

題海拾貝:P1833 櫻花

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

擺脫拖延癥的詳細計劃示例

以下是一個以一周為周期&#xff0c;幫助你擺脫拖延癥的詳細計劃示例&#xff0c;你可以根據自己的實際情況進行調整和完善。 --- # 擺脫拖延癥一周計劃 ## 一、計劃目標 通過一系列有針對性的方法和行動&#xff0c;逐步克服拖延習慣&#xff0c;提高任務執行效率和自我管理…

實物工廠零件畫圖案例(上)

文章目錄 滑臺氣缸安裝板旋轉氣缸安裝板張緊調節塊長度調節塊雙軸氣缸安裝板步進電機安裝板梯形絲桿軸承座 簡介&#xff1a;案例點擊此處下載&#xff0c;這次的這幾個案例并沒有很大的難度&#xff0c;練習這幾個案例最為重要的一點就是知道&#xff1a;當你拿到一個實物的時…

【Nova UI】十六、打造組件庫之滾動條組件(中):探秘滑塊的計算邏輯

序言 在上篇文章中&#xff0c;我們完成了滾動條組件開發的前期準備工作&#xff0c;包括理論推導、布局規劃和基礎設置。現在&#xff0c;我們將把這些準備轉化為實際代碼&#xff0c;開啟滾動條組件的具體開發之旅&#x1f31f;。我們會詳細闡述如何實現各項功能&#xff0c…

laravel 使用異步隊列,context帶的上下文造成反序列化出問題

2025年5月8日17:03:44 如果你是單個應用&#xff0c;異步遞交任務&#xff0c;是在應用內部使用&#xff0c;一般不會發生這樣的問題 但是現在app項目是 app是一個應用&#xff0c;admin是一個應用&#xff0c;app吧為了接口性能吧異步任務丟給admin去執行&#xff0c;如果兩個…

深入剖析 MyBatis 位運算查詢:從原理到最佳實踐

深入剖析 MyBatis 位運算查詢&#xff1a;從原理到最佳實踐 引言 在數據庫設計中&#xff0c;位運算是一種高效存儲和查詢多選字段的常用技術。然而&#xff0c;在實際開發中&#xff0c;特別是在使用 MyBatis 這樣的 ORM 框架時&#xff0c;位運算查詢往往會遇到一些意想不到…

01 | 大模型微調 | 從0學習到實戰微調 | AI發展與模型技術介紹

一、導讀 作為非AI專業技術開發者&#xff08;我是小小爬蟲開發工程師&#x1f60b;&#xff09; 本系列文章將圍繞《大模型微調》進行學習&#xff08;也是我個人學習的筆記&#xff0c;所以會持續更新&#xff09;&#xff0c;最后以上手實操模型微調的目的。 (本文如若有…

代碼隨想錄算法訓練營第三十八天|動態規劃part6(完全背包2)

322. 零錢兌換 題目鏈接&#xff1a; 322. 零錢兌換 - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a; 代碼隨想錄 思路&#xff1a; 確定遞推公式&#xff1a; dp[j]min(dp[j],dp[j-coins[i]]1); 由于是完全背包 &#xff0c;所以遍歷順序是正序 還存在另一…

使用 ECharts GL 實現交互式 3D 餅圖:技術解析與實踐

一、效果概覽 本文基于 Vue 3 和 ECharts GL&#xff0c;實現了一個具有以下特性的 3D 餅圖&#xff1a; 立體視覺效果&#xff1a;通過參數方程構建 3D 扇形與底座動態交互&#xff1a;支持點擊選中&#xff08;位移效果&#xff09;和懸停高亮&#xff08;放大效果&#xff…

Transformer Decoder-Only 參數量計算

Transformer 的 Decoder-Only 架構&#xff08;如 GPT 系列模型&#xff09;是當前大語言模型的主流架構&#xff0c;其參數量主要由以下幾個部分組成&#xff1a; 嵌入層&#xff08;Embedding Layer&#xff09;自注意力層&#xff08;Self-Attention Layers&#xff09;前饋…

(自用)Java學習-5.8(總結,springboot)

一、MySQL 數據庫 表關系 一對一、一對多、多對多關系設計外鍵約束與級聯操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查詢 基礎查詢&#xff1a;SELECT * FROM table WHERE...聚合函數&#xff1a;COUNT()…

【日擼 Java 三百行】Day 11(順序表(一))

目錄 Day 11&#xff1a;順序表&#xff08;一&#xff09; 一、關于順序表 二、關于面向對象 三、代碼模塊分析 1. 順序表的屬性 2. 順序表的方法 四、代碼及測試 拓展&#xff1a; 小結 Day 11&#xff1a;順序表&#xff08;一&#xff09; Task&#xff1a; 在《數…

Spring Boot動態配置修改全攻略

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 無需重啟應用&#xff0c;實時更新配置的終極指南 在微服務架構中&#xff0c;動態配置管理是提高系統靈活性的關鍵技術。本文將通過4種主流方案&#xff0c…

精益數據分析(55/126):雙邊市場模式的挑戰、策略與創業階段關聯

精益數據分析&#xff08;55/126&#xff09;&#xff1a;雙邊市場模式的挑戰、策略與創業階段關聯 在創業和數據分析的學習旅程中&#xff0c;我們持續探索不同商業模式的奧秘。今天&#xff0c;依舊懷揣著與大家共同進步的想法&#xff0c;深入研讀《精益數據分析》&#xf…

linux內核pinctrl/gpio子系統驅動筆記

目錄 一、簡單介紹二、主要源碼文件和目錄gpio子系統pinctrl子系統兩個子系統之間的關系設備樹例子 三、主要的數據結構gpio子系統pinctrl子系統 四、驅動初始化流程五、難點說明 一、簡單介紹 GPIO子系統: Linux GPIO子系統是Linux內核中負責處理GPIO&#xff08;通用輸入輸出…

Vue 2 項目中配置 Tailwind CSS、Font Awesome和daisyUI

Vue 2 項目中配置 Tailwind CSS 和 安裝 daisyUI 首先重點注意&#xff0c;Vue2中安裝Tailwind和daisyui一定要注意版本。 最佳版本 使用 Vue 2 TailwindCSS v2 DaisyUI v1 的兼容版本 "tailwindcss": "npm:tailwindcss/postcss7-compat^2.2.17", &q…

5.11 - 5.12 JDBC+Mybatis+StringBoot項目配置文件

JDBC&#xff1a; 預編譯SQL優點&#xff1a;安全&#xff0c;性能更高。 在cmd里面輸入java-jar就可以運行jar包。 Mybatis&#xff1a; 持久層框架。用于簡化JDBC的開發。 數據庫連接池里面放置的是一個一個Connection連接對象。&#xff08;連接池中的連接可以復用&#…