C++異步(1)

什么是異步?

異步就是多個線程是同時執行的,與之相對的就是線程同步,二者都應用在并發的場景上。

異步的特點

異步執行的任務無需等待其他任務完成,其本身是通過非阻塞的方式執行的,不依賴前驅任務,通常用于IO密集型場景。

非阻塞:線程不會被其他線程阻塞;

回調或事件驅動:

1、可以通過最直接采用策略執行回調函數,自動創建和管理線程;

2、還可以通過primise收到那個執行線程設置future的異步結果;

未來類--future

future簡單來說就是存儲線程結果的一個模版類,我們可以通過其get方法獲取其異步編程結果的值;

async策略

執行策略:launch::async代表的是立刻在當前線程處執行異步回調函數;

//執行線程回調函數
double func(){cout<<"我是線程回調函數"<<endl; return 6.6;
}void testfuture(){future<double> ret=async(launch::async,func);//立即執行的策略cout<<"開始睡眠"<<endl;sleep(2);auto res=ret.get();cout<<"future:"<<res<<endl; 
}

其中ret接收的就是異步線程回調函數的返回值;

deferred策略

該執行策略代表的是延遲執行,也就是主線程執行到async函數時不會立刻觸發執行異步回調函數,而是在后續調用future的get方法時才會觸發執行回調函數;

#pragma once 
#include <future>
#include <iostream>
#include <unistd.h>
using namespace std; //執行線程回調函數
double func(){cout<<"我是線程回調函數"<<endl; return 6.6;
}void testfuture2(){future<double>ret=async(launch::deferred,func);//延遲執行策略cout<<"開始睡眠"<<endl;sleep(2);auto res=ret.get();cout<<"future:"<<res<<endl; 
}

這段程序的執行結果就是先打印“開始睡眠“,然后睡眠2s,執行到get處,才執行回調函數,打印"我是線程回調函數",返回res獲取返回值6.6,最后打印"future:6.6";

Promise(承諾未來值)

Promise也是一個模版類,通常配合future使用,用于在線程間傳遞數據同步異步操作的結果

解決的問題

(1) 線程間結果的傳遞
  • 普通線程函數只能通過參數傳遞輸入數據,但無法直接返回計算結果(除非使用全局變量或指針,但這不夠安全)。

  • promise?提供了一種安全、標準化的方式,讓一個線程(生產者)可以設置一個值,而另一個線程(消費者)可以通過?future?獲取這個值。

(2) 異步操作的同步
  • 在異步編程中,我們可能需要等待某個線程完成任務并獲取其結果,而?promise/future?提供了一種線程安全的等待機制,避免了手動使用條件變量或鎖。

(3) 異常傳遞
  • 如果一個線程在執行過程中拋出異常,可以通過?promise?將異常傳遞給?future,讓調用方能夠捕獲并處理它。

實現方案

promise+move

#include <iostream>
#include <future>
#include <thread>using namespace std;void task(promise<int> pro) {pro.set_value(666);
}int main() {promise<int>ff;//綁定future和promisefuture<int>fut = ff.get_future();thread t(task,move(ff));//獲取結果cout <<"異步future:"<< fut.get() << endl;t.join();return 0;
}

這種方案是比較安全的,因為沒有使用指針和引用,關鍵點在于,中間變量作為參數,回調執行完就會釋放掉參數pro;

那么問題來了,回調執行完就會釋放掉pro,那future還能獲取結果嗎?

答案是可以的!future從promise讀取結果的過程在于set_value寫入,執行回調之前future和prommise已經綁定了共享的關系,而set_value就會同步數據給future;即便是后續參數pro和主線程的ff都無效了,future依舊可以獲取到正確的結果;

promise+ref

#include <iostream>
#include <future>
#include <thread>using namespace std;void task(promise<int>& pro) {pro.set_value(666);
}int main() {promise<int>ff;//綁定future和promisefuture<int>fut = ff.get_future();thread t(task,ref(ff));//獲取結果cout <<"異步future:"<< fut.get() << endl;t.join();return 0;
}

與上面的區別在于回調的參數是引用,而是實參需要使用ref強調傳遞的是引用對象,這種方法因涉及引用,所以沒有使用move安全一些;

性能分析:

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

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

相關文章

向量數據庫Milvus03-高級功能與性能調優

Milvus高級功能與性能調優 目錄 高級特性詳解性能調優技巧生產環境部署最佳實踐總結與展望 1. 高級特性詳解 1.1 多索引兼容 Milvus 支持多種索引類型&#xff08;如 HNSW、IVF_PQ、IVF_FLAT&#xff09;的混合使用&#xff0c;以適應不同場景的需求。 HNSW&#xff08;Hier…

5月24日day35打卡

模型可視化與推理 知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀推理的寫法&#xff1a;評估模式 作業&#xff1a;調整模型定義時的超參數&#x…

野火魯班貓(arrch64架構debian)從零實現用MobileFaceNet算法進行實時人臉識別(三)用yolov5-face算法實現人臉檢測

環境直接使用第一篇中安裝好的環境即可 先clone yolov5-face項目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下載預訓練權重文件yolov5n-face.pt 網盤鏈接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取碼: lw9j &#xff08;野火官方提供&am…

R語言科研編程-柱狀圖

R語言簡介 R語言是一種開源的統計計算和圖形繪制編程語言&#xff0c;廣泛應用于數據分析、機器學習、數據可視化等領域。它由Ross Ihaka和Robert Gentleman于1993年開發&#xff0c;具有豐富的統計函數庫和圖形功能&#xff0c;尤其適合數據科學研究和可視化任務。 使用R語言…

Android-Handler學習總結

??面試官?&#xff1a;你好&#xff01;我看你簡歷里提到熟悉 Android 的 Handler 機制&#xff0c;能簡單說一下它的作用嗎&#xff1f; ?候選人?&#xff1a; Handler 是 Android 中用來做線程間通信的工具。比如Android 應用的 UI 線程&#xff08;也叫主線程…

【iOS】分類、擴展、關聯對象

分類、擴展、關聯對象 前言分類擴展擴展和分類的區別關聯對象key的幾種用法流程 總結 前言 最近的學習中筆者發現自己對于分類、擴展相關知識并不是很熟悉&#xff0c;剛好看源碼類的加載過程中發現有類擴展與關聯對象詳解。本篇我們來探索一下這部分相關知識&#xff0c;首先…

30.第二階段x64游戲實戰-認識網絡數據包發送流程

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 上一個內容&#xff1a;29.第二階段x64游戲實戰-技能冷卻 發送數據包的方式&#xff08;函數&#xff09;操作系統提供…

【每日一題】【前綴和優化】【前/后綴最值】牛客練習賽139 B/C題 大衛的密碼 (Hard Version) C++

牛客練習賽139 B題 大衛的密碼 (Easy Version) 牛客練習賽139 C題 大衛的密碼 (Hard Version) 大衛的密碼 題目背景 牛客練習賽139 題目描述 給定一個 n m n\times m nm的網格圖&#xff0c;我們使用 ( i , j ) (i,j) (i,j)表示網格中從上往下數第 i i i行和從左往右數第…

文件夾圖像批處理教程

前言 因為經常對圖像要做數據清洗&#xff0c;又很費時間去重新寫一個&#xff0c;我一直在想能不能寫一個通用的腳本或者制作一個可視化的界面對文件夾圖像做批量的修改圖像大小、重命名、劃分數據訓練和驗證集等等。這里我先介紹一下我因為寫過的一些腳本&#xff0c;然后我…

【Unity實戰筆記】第二十四 · 使用 SMB+Animator 實現基礎戰斗系統

轉載請注明出處&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/146409453 作者&#xff1a;CSDN|Ringleader| 1 結構 1.1 狀態機 1.2 SMB 2 代碼實現 2.1 核心控制 Player_Base_SMB 繼承 StateMachineBehaviour &#xff0c;控制變量初始…

Python虛擬環境再PyCharm中自由切換使用方法

Python開發中的環境隔離是必不可少的步驟,通過使用虛擬環境可以有效地管理不同項目間的依賴,避免包沖突和環境污染。虛擬環境是Python官方提供的一種獨立運行環境,每個項目可以擁有自己單獨的環境,不同項目之間的環境互不影響。在日常開發中,結合PyCharm這樣強大的IDE進行…

大模型智能體入門掃盲——基于camel的概述

前言 本篇博客想帶讀者進行一個智能體入門掃盲&#xff0c;了解基礎知識&#xff0c;為什么用camel呢&#xff0c;因為小洛發現它們文檔對這種智能體的基本組件介紹得很全面深入。 基礎概念 agent 一個典型的agent智能體包含三個核心部分&#xff1a; 感知模塊&#xff1…

目標檢測 RT-DETR(2023)詳細解讀

文章目錄 主干網絡&#xff1a;Encoder&#xff1a;不確定性最小Query選擇Decoder網絡&#xff1a; 將DETR擴展到實時場景&#xff0c;提高了模型的檢測速度。網絡架構分為三部分組成&#xff1a;主干網絡、混合編碼器、帶有輔助預測頭的變換器編碼器。具體來說&#xff0c;先利…

DeepSeek 賦能數字農業:從智慧種植到產業升級的全鏈條革新

目錄 一、數字農業的現狀與挑戰二、DeepSeek 技術解析2.1 DeepSeek 的技術原理與優勢2.2 DeepSeek 在人工智能領域的地位與影響力 三、DeepSeek 在數字農業中的應用場景3.1 精準種植決策3.2 病蟲害監測與防治3.3 智能灌溉與施肥管理3.4 農產品質量追溯與品牌建設 四、DeepSeek …

<uniapp><vuex><狀態管理>在uniapp中,如何使用vuex實現數據共享與傳遞?

前言 本專欄是基于uniapp實現手機端各種小功能的程序&#xff0c;并且基于各種通訊協議如http、websocekt等&#xff0c;實現手機端作為客戶端&#xff08;或者是手持機、PDA等&#xff09;&#xff0c;與服務端進行數據通訊的實例開發。 發文平臺 CSDN 環境配置 系統&…

高速串行差分信號仿真分析及技術發展挑戰續

7.3 3.125Gbps 差分串行信號設計實例仿真分析 7.3.1 設計用例說明 介紹完 Cadence 系統本身所具有的高速差分信號的仿真分析功能之后&#xff0c;我們以一個實例來說明 3.125Gbps 以下的高速差分系統的仿真分析方法。 在網上下載的設計文件“Booksi_Demo_Allegro160_Finishe…

【Golang】部分語法格式和規則

1、時間字符串和時間戳的相互轉換 func main() {t1 : int64(1546926630) // 外部傳入的時間戳&#xff08;秒為單位&#xff09;&#xff0c;必須為int64類型t2 : "2019-01-08 13:50:30" // 外部傳入的時間字符串//時間轉換的模板&#xff0c;golang里面只能是 &quo…

第十六章:數據治理之數據架構:數據模型和數據流轉關系

本章我們說一下數據架構&#xff0c;說到數據架構&#xff0c;就很自然的想到企業架構、業務架構、軟件架構&#xff0c;因為個人并沒有對這些內容進行深入了解&#xff0c;所以這里不做比對是否有相似或者共通的地方&#xff0c;僅僅來說一下我理解的數據架構。 1、什么是架構…

Day126 | 靈神 | 二叉樹 | 層數最深的葉子結點的和

Day126 | 靈神 | 二叉樹 | 層數最深的葉子結點的和 1302.層數最深的葉子結點的和 1302. 層數最深葉子節點的和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 這道題用層序遍歷的思路比較好想&#xff0c;就把每層的都算一下&#xff0c;然后返回最后一層的和就…

PCIE 4.0 vs PCIE 5.0固態硬盤——區別、科普與選購場景全解析

隨著數字內容和高性能計算需求的爆發&#xff0c;固態硬盤&#xff08;SSD&#xff09;已成為PC、游戲主機和工作站不可或缺的核心硬件。面對市面上層出不窮的新一代SSD產品&#xff0c;大家最常見的一個疑惑&#xff1a;**PCIe 4.0和PCIe 5.0固態硬盤&#xff0c;到底有啥區別…