C++ 多線程使用future傳遞異常

如果 std::async 調用的函數拋出異常,那么這個異常會被存儲在值的位置,同時 future 變為 ready ,如果調用 get() 會重新拋出存儲的異常。

Note:

標準并沒有指定原來的異常對象是被重新拋出或者拷貝后拋出,不同的編譯器會做不同的選擇。

對于 std::packaged_task<> 包裝的函數如果拋出異常,那么處理與 std::async 一致。 std::promise<> 提供類似的機制,如果期望存儲一個異常那么在 std::promise<> 對象上就需要使用 set_exception() 代替 set_value()

保存一個異常到 future 中的另外一個方式是在沒有調用 std::promise<>set_xxxx 函數或者沒有執行被 std::packaged_task<> 包裝的任務的情況下就銷毀與 future 關聯的 std::promise<>std::packaged_task<>。無論哪種情況,析構函數都會存儲一個錯誤碼是 std::future_errc::broken_promisestd::future_error 異常,表示關聯的 future 并沒有 ready

#include <iostream>
#include <future>int main() {// std::asyncstd::future<void> result1 = std::async([] { throw std::runtime_error("runtime error."); });try {result1.get();} catch (const std::runtime_error &e) {std::cout << "Async exception: " << e.what() << std::endl;}std::promise<int> promise;try {// 正常的情況就set_value
//        promise.set_value(66);// 主動拋出一個異常進行測試throw std::out_of_range("the value out of range.");} catch (...) {// 使用std::current_exception 存儲被拋出的異常;// 可以使用 std::copy_exception 存儲沒有被拋出的異常;promise.set_exception(std::current_exception());}try {promise.get_future().get();} catch (const std::out_of_range &e) {std::cout << "Promise exception: " << e.what() << std::endl;}// 存儲異常的其他方式,// 在沒有調用 std::promise的set_xxx函數// 或者沒有調用被 std::packaged_task 包裝的任務情況下// 就銷毀與 future關聯的 std::promise,std::packaged_task 對象// std::packaged_task<>std::future<void> future;try {// 提前銷毀task{std::packaged_task<void()> task([] {std::cout << "do packaged task." << std::endl;});future = task.get_future();}future.get();}catch (const std::future_error &e) {std::cout << "Packaged task exception: " << e.what() << std::endl;}// std::promise<>try {// 提前銷毀promise{std::promise<void> promise;future = promise.get_future();}future.get();}catch (const std::future_error &e) {std::cout << "Promise exception: " << e.what() << std::endl;}return 0;
}

更多內容:https://blog.nas-kk.top/?p=106

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

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

相關文章

期貨黃金與現貨黃金比較

現貨黃金與期貨黃金是目前市場上最熱門的黃金投資方式&#xff0c;與國內任何的金融投資品相比&#xff0c;都具有一定的優勢。 其實金投網小編覺得現貨黃金與期貨黃金最主要的不同點是這個&#xff1a;期貨黃金做的是國內市場&#xff0c;同股票市場一樣&#xff0c;里面有莊家…

DNS域傳送漏洞

0x00 相關背景介紹 Dns是整個互聯網公司業務的基礎&#xff0c;目前越來越多的互聯網公司開始自己搭建DNS服務器做解析服務&#xff0c;同時由于DNS服務是基礎性服務非常重要&#xff0c;因此很多公司會對DNS服務器進行主備配置而DNS主備之間的數據同步就會用到dns域傳送&#…

封裝之--通過類中公有方法訪問私有成員變量

如何在ClassB中訪問ClassA的私有成員變量&#xff1f;&#xff08;典型的封裝案例&#xff09; 通過在ClassA中定義公有的成員方法&#xff0c;然后&#xff0c;在ClassB中通過ClassA的對象調用ClassA中的公有方法&#xff0c;來訪問ClassA中的私有成員變量。 轉載于:https://w…

匹配物鏡放大倍數與相機像元尺寸

通常來說&#xff0c;相機內部的CCD或者CMOS傳感器上都有感光陣列&#xff0c;由一個一個的感光元件構成&#xff0c;每一個感光元件負責完成光電轉換的過程。簡單理解&#xff0c;一個感光元件可以認為就是一個像素(pixel)或像元(pel)。像元具有一定尺寸&#xff0c;如果像的尺…

2016/11/10 kettle概述

ETL(Extract-Transform-Load&#xff0c;即抽取&#xff0c;轉換&#xff0c;加載)&#xff0c;數據倉庫技術&#xff0c;是用來處理將數據從來源&#xff08;以前做的項目&#xff09;經過抽取&#xff0c;轉換&#xff0c;加載到達目的端&#xff08;正在做的項目&#xff09…

【深度學習】——非極大值抑制(nms/soft-nms)

目錄 一、相關概念 1、iou 1&#xff09;理論計算 2&#xff09;Python代碼&#xff08;代碼參考yolov3模型util.py文件&#xff09; 2、nms 1)基本思路 2&#xff09;標準nms和soft-nms 3&#xff09;Python代碼實現&#xff08;yolov3中util.py文件&#xff0c;增加了…

移動服務安全現狀分析!

2019獨角獸企業重金招聘Python工程師標準>>> 由于Android開源的環境&#xff0c;導致Android的整體環境都存在很多不安全的因素&#xff0c;同時用戶在移動APP客戶端的便捷應用&#xff0c;也給用戶帶來了巨大的安全隱患。未經過移動服務安全加固的APP存在被靜態反編…

封裝不同類模板的隨機數生成器

最近準備刷題&#xff0c;打算簡單封裝下隨機數生成器&#xff0c;方便產生測試數據。C11的STL提供了很多分布類型&#xff0c;我比較常用的是均勻分布&#xff0c;均勻分布的值有兩種類型&#xff0c;一類是整數&#xff0c;另一類是浮點數&#xff0c;STL根據值的類型定義了兩…

Log4j詳細設置說明

1. 動態的改變記錄級別和策略&#xff0c;即修改log4j.properties,不需要重啟Web應用&#xff0c;這需要在web.xml中設置一下。2. 把log文件定在 /WEB-INF/logs/ 而不需要寫絕對路徑。3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ &#xff0c;而不是Class-Pat…

【機器學習】——卷積神經網絡(Keras)修改學習率(定值+自適應)

目錄 1、直接獲取現有模型的學習率 2、打印顯示學習率 3、調整學習率 1&#xff09;1.LearningRateScheduler 2&#xff09;ReduceLROnPlateau 利用tensorflow的Keras模塊我們可以建立我們自己定義的卷積神經網絡模型&#xff0c;但是一般不會觸碰到學習率這個問題&#x…

使用Docker構建你的第一個服務

1. 感受一下Docker的便捷 項目源碼 https://github.com/MoonShining/dockernize-grape-helloworld clone下來以后運行,cd到項目目錄下&#xff0c;運行 docker build -t api-sample . docker run -p 8080:8080 api-sample:latest 復制代碼就可以訪問localhost:8080看到效果了. …

MyEclipse連接MySQL

在官網http://www.mysql.com/downloads/下載數據庫連接驅動 本文中使用驅動版本為mysql-connector-java-5.1.40 一、創建一個java測試項目MySQLConnectorsTest 在項目下穿件一個lib文件夾用來存放MySQL驅動包。 右鍵驅動包build path進行add添加操作&#xff0c;打開Referenced…

在Windows系統中配置Google AddressSanitizer

Google AddressSanitizer簡介 AddressSanitizer (ASan) 是 C 和 C 的內存錯誤檢測軟件&#xff0c;它可以檢測&#xff1a; 釋放指針后繼續使用堆緩沖區溢出棧緩沖區溢出全局緩沖區溢出返回后繼續使用在范圍之外繼續使用初始化順序的bug內存泄漏 在 Windows 系統中&#xff…

【劍指offer】——求出一個正整數的質數因子(Python)

目錄 一、題目描述 二、思路 1、短除法 2、平方根法 一、題目描述 功能:輸入一個正整數&#xff0c;按照從小到大的順序輸出它的所有質因子&#xff08;重復的也要列舉&#xff09;&#xff08;如180的質因子為2 2 3 3 5 &#xff09; 最后一個數后面也要有空格 輸入描述…

Python字符串筆錄

python字符串操作實方法&#xff0c;包括了幾乎所有常用的python字符串操作&#xff0c;如字符串的替換、刪除、截取、復制、連接、比較、查找、分割等 1、去空格及特殊符號 >>> s 123 >>> s.strip() # 去除所有空格123 >>> s1 123 >>&…

第九周進度條

第六周學習進度條 星期一 星期二 星期三 星期四 星期五 星期六 星期日 所花時間 &#xff08;包括上課&#xff09; 無 上午8:00-9:50 無 無 下午4:00-5:00 下午3&#xff1a;00-5&#xff1a;30 代碼量&#xff08;行&#xff09; 0行 260行 0行 0行 0行 0…

C++ STL實現的優先隊列( priority_queue )

本文參考的源碼版本&#xff1a;gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)。 priority_queue 本質是容器適配器&#xff0c;它對內部容器的元素有自己的管理方式&#xff0c;而 priority_queue 實際維護的是一個二叉堆。STL中 priority_queue 的…

【Python函數】——sort,sorted

1、sorted和sort的常規使用 2、關于自定義比較函數 3、試驗 from functools import cmp_to_key ll [(2,3,10),(1,2,3),(5,6,7),(2,5,10),(2,4,10)]# 根據一個維度進行排序&#xff0c;這里根據第一維排序 ll1 sorted(ll,key lambda x:x[0]) print(根據一個維度進行排序&a…

生成相關矩陣

U是X&#xff08;差異矩陣&#xff09;各列向量取方向后形成的矩陣&#xff0c;CU^T * U 即相關矩陣&#xff0c;即各列向量兩兩的夾角&#xff0c;&#xff08;夾角越小說明關聯度越高&#xff09; clc avg_e66;avg_m66;avg_s76; x1[61 63 78 65 63] -avg_e; x2[53 73 61 84 5…