C++11使用std::future和std::promise實現線程同步和異步通信

std::future 和 std::promise 是 C++11 引入的標準庫特性,用于實現線程間的異步通信和同步。它們提供了一種機制,使一個線程能夠生成一個值或異常,并讓另一個線程獲取這個值或異常。

(線程A中設置結果)
std::promise 用于設置異步操作的結果
(線程B中獲取結果)
std::future   提供了一種機制,使線程能夠等待異步操作的結果

示例:std::promise 和 std::future的使用

#include <iostream>
#include <thread>
#include <future>// 線程函數,使用 promise 設置結果
void set_promise_value(std::promise<int>& prom) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬耗時操作prom.set_value(42); // 設置 promise 的結果值
}int main() {// 創建 promise 對象std::promise<int> prom;// 獲取與 promise 關聯的 future 對象std::future<int> fut = prom.get_future();// 創建線程,并將 promise 傳遞給線程函數std::thread t(set_promise_value, std::ref(prom));// 在主線程中等待 future 的結果std::cout << "Waiting for result..." << std::endl;int result = fut.get(); // 獲取結果(此時會阻塞,直到 promise 設置結果)// 輸出結果std::cout << "Result: " << result << std::endl;// 等待線程結束t.join();return 0;
}
使用 std::async

std::async 提供了一個更簡單的方法來啟動異步任務并獲取其結果。下面是一個使用 std::async 的示例:

#include <iostream>
#include <future>// 異步任務函數
int async_task() {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬耗時操作return 42;
}int main() {// 啟動異步任務std::future<int> fut = std::async(std::launch::async, async_task);// 在主線程中等待異步任務的結果std::cout << "Waiting for result..." << std::endl;int result = fut.get(); // 獲取結果(此時會阻塞,直到異步任務完成)// 輸出結果std::cout << "Result: " << result << std::endl;return 0;
}

總結

  • std::future:用于獲取異步操作的結果,可以阻塞直到結果可用(eg:std::future.get()方法)。
  • std::promise:用于設置異步操作的結果,通常與 std::future 一起使用。
  • std::async:提供了一種簡單的方式來啟動異步任務并返回一個 std::future,用于獲取任務結果。

通過使用 std::future 和 std::promise,可以方便地在不同線程之間進行同步和數據傳遞,簡化了異步編程的復雜性。

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

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

相關文章

【Jupyter Notebook與Git完美融合】在Notebook中駕馭版本控制的藝術

標題&#xff1a;【Jupyter Notebook與Git完美融合】在Notebook中駕馭版本控制的藝術 Jupyter Notebook是一個流行的開源Web應用程序&#xff0c;允許用戶創建和共享包含實時代碼、方程、可視化和解釋性文本的文檔。而Git是一個廣泛使用的分布式版本控制系統&#xff0c;用于跟…

關于C#在WPF中如何使用“抽屜”控件

關于C#在WPF中如何使用“抽屜”控件 1.前提準備2.XAML代碼3.對應的C#代碼4.顯示效果1.前提準備 需要引用MaterialDesign控件庫,關于如何引用,請參照文章——關于C#如何引用MaterialDesign控件庫 2.XAML代碼 <Window x:Class="MaterialDesign_Test.MainWindow"…

化身成羊:關于羊的詞群探析

在西方的神話故事中&#xff0c;像主神宙斯&#xff0c;或者基督教義中的上帝&#xff0c;通常都有化身成羊的形象。 那為什么會這樣呢&#xff1f; 一、什么是神話(myth)&#xff1f; 神話&#xff0c;正式的用詞是 mythology&#xff1a; mythology n.神話&#xff1b;神話…

Http接口RestSharp中StatusCode返回0, 但服務器或本地postman獲取應答正常(C#)

我的本地和其他服務器用同一段代碼都可以訪問&#xff1a; 原代碼&#xff1a; RestClient client new RestClient(url); client.Timeout -1; RestRequest request new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer " acc…

Echarts中的折線圖,多個Y軸集中在左側(在Vue中使用多個Y軸的折線圖)

簡述&#xff1a;在 ECharts 中&#xff0c;創建一個帶有多個 Y 軸的折線圖&#xff0c;并且將這些 Y 軸都集中顯示在圖表的左側&#xff0c;可以通過合理配置 yAxis 和 series 的屬性來實現。簡單記錄 一. 函數代碼 drawCarNumEcs() {// 初始化echarts圖表,并綁定到id為"…

網絡安全設備——探針

網絡安全設備探針是一種專門用于網絡安全領域的工具&#xff0c;它通過對網絡流量進行監控和分析&#xff0c;幫助發現和防止網絡攻擊。以下是對網絡安全設備探針的詳細解釋&#xff1a; 定義與功能 定義&#xff1a;網絡安全設備探針是一種設備或軟件&#xff0c;它通過捕獲…

【docker】運行階段遇到的問題

目錄 1、查詢docker 下掛載了哪些工具 2、docker中的簡單命令 3、實際場景應用&#xff08;redis&#xff09; 目前工作中僅用到了redis,所以沒有太多經驗可以交流&#xff0c;暫時僅將我目前遇到的進行發布。還請見諒。 1、查詢docker 下掛載了哪些工具 docker ps -a 或者…

Vue組件如何“傳話”?這里有個小秘訣!

?&#x1f308;個人主頁&#xff1a;前端青山 &#x1f525;系列專欄&#xff1a;vue篇 &#x1f516;人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue-組件通信 目錄 Vue組件通信 &#xff08;1&#xff09; props / $emit 1. 父組件向子組件傳…

適合職場小白的待辦事項管理方法和工具

剛入職場那會兒&#xff0c;我每天都像只無頭蒼蠅&#xff0c;忙得團團轉卻效率低下。待辦事項像潮水般涌來&#xff0c;會議、報告、客戶跟進……每一項都像是懸在頭頂的利劍&#xff0c;讓我焦慮不堪。我深知&#xff0c;管理好待辦事項是職場生存的必修課&#xff0c;但該如…

內衣洗衣機哪個牌子好用?傾力推薦四大熱門產品,質量放心

在當今社會&#xff0c;內衣洗衣機已經成為每個家庭必不可少的家電之一。但由于市場上的內衣洗衣機品牌和型號繁多&#xff0c;對于消費者來說&#xff0c;選擇一款實用、性價比高的內衣洗衣機是非常重要的。那么&#xff0c;內衣褲洗衣機哪個品牌最好&#xff1f;接下來我將會…

框架為我們做了什么?

1. SpringBoot 1.1 web服務器 Spring Boot 的 web 服務器原理主要基于其嵌入式服務器的概念&#xff0c;這意味著它內嵌了一個 web 服務器&#xff0c;無需部署到外部服務器上。Spring Boot 內嵌了如 Tomcat、Jetty 或 Undertow 等 servlet 容器。 1.2 servlet Servlet&…

【鴻蒙學習筆記】創建自定義組件

官方文檔&#xff1a;創建自定義組件 目錄標題 自定義組件的基本結構&#xff11;?struct 自定義組件名 {...}&#xff20;ComponentEntry &#xff11;? &#xff12;? &#xff13;? &#xff14;? &#xff15;? &#xff16;? &#xff17;? &#xff18;? &…

Python | Leetcode Python題解之第206題反轉鏈表

題目&#xff1a; 題解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseList(self, head: Optional[ListNode]) -> Optio…

VulnHub靶場之DarkHole_1

1 信息收集 1.1 主機發現 arp-scan -l 主機IP地址為&#xff1a;192.168.1.17 1.2 端口和服務掃描 nmap -sS -sV -A -T5 -p- 192.168.1.17 開放22&#xff0c;80端口 1.3 目錄掃描 dirsearch -u 192.168.1.17 2 滲透 2.1 訪問端口 2.2 注冊賬號 暴力破解不現實&#…

Python爬取國家醫保平臺公開數據

國家醫保服務平臺數據爬取python爬蟲數據爬取醫療公開數據 定點醫療機構查詢定點零售藥店查詢醫保機構查詢藥品分類與代碼查詢 等等&#xff0c;數據都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 簽名參數&#xff1a;signData {dat…

【AI原理解析】-目標檢測概述

目錄 一、目標檢測算法的分類 1. 基于傳統方法的目標檢測算法 2. 基于深度學習的目標檢測算法 二、主要目標檢測算法 1. R-CNN系列 2. YOLO系列 3. SSD 4. RetinaNet 三、目標檢測算法的特點 四、評估指標 五、應用領域 一、目標檢測算法的分類 目標檢測算法主要分…

java版本ERP管理系統源碼 Spring Cloud ERP_ERP系統_erp軟件_ERP管理系統

在當今數字化時代&#xff0c;企業對高效、穩定且易于擴展的管理系統的需求日益增長。為了滿足這一需求&#xff0c;我們精心打造了一款基于Java技術的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系統。該系統充分利用了Spring Cloud Alibaba、Spring Boot、…

python-計算矩陣邊緣元素之和(賽氪OJ)

[題目描述] 輸入一個整數矩陣&#xff0c;計算位于矩陣邊緣的元素之和。 所謂矩陣邊緣的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。輸入&#xff1a; 輸入共 m 1 行。 第一行包含兩個整數 m, n (1 < m,n < 100) &#xff0c;分別為矩陣的…

VDS虛擬導播切換臺軟件

VDS 導播軟件是一款功能強大的虛擬導播系統軟件&#xff0c;具有全媒體接入、播出內容豐富、調音臺、快捷切播與導播鍵盤、云臺控制等特點&#xff0c;同時支持向多個平臺直播推流。以下是一些常見的 VDS 導播軟件特點&#xff1a; 1. 全媒體接入&#xff1a;支持多種設備和網…

Ubuntu和Windows系統之Mamba_ssm安裝

Mamba的論文&#xff1a;https://arxiv.org/abs/2312.00752 Mamba的github&#xff1a;https://github.com/state-spaces/mamba 一、Ubuntu安裝 直接新建一個環境是最好的&#xff0c;不然很容易產生各種沖突 # 創建環境和相關包 conda create -n mamba python3.10.13 cond…