【C++11并發】future庫 筆記

簡介

C++11之前,主線程要想獲取子線程的返回值,一般都是通過全局變量,或者類似機制。C++11開始為我們提供了一組方法來獲取子線程的返回值,并保證其原子性。

頭文件

#include <future>

std::promise

在promise中保存了一個值或者異常,可以通過與其關聯的 std::future 來獲取這個值或者異常。常規用法

promise有兩個特化的版本

template< class R > class promise;    // 普通類模板
template< class R > class promise<R&>;    // 引用特化
template<> class promise<void>;    // void特化

promise提供的方法
在這里插入圖片描述
構造方法

promise();    // 默認構造方法
template< class Alloc >
promise( std::allocator_arg_t, const Alloc& alloc );    // cppreference上說是基于一個共享狀態構造promise,還沒有深入研究具體怎么用
promise( promise&& other ) noexcept;    // 移動構造方法
promise( const promise& other ) = delete;    // 刪除了拷貝構造方法

析構方法
析構的時機有兩個

  • promise內部共享狀態為ready時
  • 如果promise的狀態沒有被設置為ready析構時,會將std::future_error異常保存到共享狀態里

和構造方法類似,promise只支持移動賦值操作符

promise& operator=( promise&& other ) noexcept;
promise& operator=( const promise& rhs ) = delete;

獲取future,如果get_future是被重復調用的,那么就會拋出std::future_error異常。如果想多個地方獲取future,需要使用std::shared_future,他可以通過std::future構造。這是std::shared_future相應的構造方法的聲明:shared_future( std::future&& other )

std::future<R> get_future();

設置共享數據,以及將共享狀態設置為ready。由于promise有特化版本,下面聲明的方法有些版本沒有。另外,如果重復調用set_value會拋出std::future_error異常,即set_value只能調用一次。

void set_value( const R& value );    // member only of generic promise template
void set_value( R&& value );     //member only of generic promise template
void set_value( R& value );     // member only of promise<R&> template specialization
void set_value();    // 設置共享狀態為ready

設置異常,以及將共享狀態設置為ready,例子

void set_exception( std::exception_ptr p );

set_value_at_thread_exit 和 set_exception_at_thread_exit 類似set_value 和 set_exception,不同點是 xx_at_thread_exit 是在線程結束的時候將共享狀態設置為ready,而set_xx 是立刻設置為ready。

std::future

future類是獲取異步操作返回的封裝。promise相當于是set,future相當于是get

類似promise,future也有兩個特化版本

template< class T > class future;
template< class T > class future<T&>;
template<> class future<void>;

future提供的方法
在這里插入圖片描述
構造方法

future() noexcept;    // 不關聯任何共享狀態
future( future&& other )     // 移動構造
future( const future& other ) = delete;    // 拷貝構造被刪除

只有移動賦值操作符

future& operator=( future&& other ) noexcept;
future& operator=( const future& other ) = delete;

從構造方法和移動賦值操作符可以看出,future是唯一關聯共享狀態的,如果想多個future關聯一個共享狀態,future是不行的,需要將其轉為std::shared_future。對應的方法是share:

std::shared_future<T> share() noexcept;

share方法內部是這么構造shared_future的:std::shared_future(std::move(*this)),所以調用share方法后,原理的future就不在關聯共享狀態了,也就不能再調用相關get方法,否則會拋出異常

std::shared_future

和std::future唯一的不同就是,std::shared_future可以多個對象同時關聯同一個共享狀態。他的特化版本、提供的方法和std::future也基本類似:
在這里插入圖片描述

std::packaged_task

將可調用對象(函數,lambda表達式,仿函數等)包裝后,可以異步調用,通過std::future獲取返回值。參考代碼

std::packaged_task 提供的方法
在這里插入圖片描述

構造方法

packaged_task() noexcept;template< class F >
explicit packaged_task( F&& f );    // f為可調用對象,他是一個萬能引用,即構造package_task的時候,可以傳遞給他可調用對象的左值,右值,左值引用,右值引用;參考:https://zhuanlan.zhihu.com/p/99524127template< class F, class Allocator >
explicit packaged_task( std::allocator_arg_t, const Allocator& a, F&& f );    // C++17刪除了該方法packaged_task( const packaged_task& ) = delete;packaged_task( packaged_task&& rhs ) noexcept;    // 移動構造方法

析構方法
如果在共享狀態設置為ready之前析構package_task,會拋出 std::future_errc::broken_promise 異常

只有移動賦值操作符

packaged_task& operator=( const packaged_task& ) = delete;
packaged_task& operator=( packaged_task&& rhs ) noexcept;

判斷package_task對象是否有共享狀態,比如用無參的構造方法構造的對象,就沒有共享狀態

bool valid() const noexcept;

獲取future,如果重復調用get_future,會拋出std::future_error異常;另外,如果valid()方法返回為false,調用get_future,也會拋出std::future_error異常

std::future<R> get_future();

執行保存的可調用對象,和get_future一樣重復調用,或者pakage_task對象沒有共享狀態,都會拋出std::future_error異常

void operator()( ArgTypes... args );

在線程結束,局部變量釋放后,將共享狀態設置為ready。拋出異常的情況和operator()一樣

void make_ready_at_thread_exit( ArgTypes... args );

重置package_task的共享狀態,等價于 *this = packaged_task(std::move(f)), f 是可調用對象。此時會構造新的共享狀態,如果沒有足夠內存,會拋出std::bad_alloc異常。如果package_task對象沒有共享狀態,就會拋出std::future_error異常

void reset();

std::async

異步直行一個可調用對象
在這里插入圖片描述

enum class launch : /* unspecified */ {async =    /* unspecified */,    // 立刻異步直行deferred = /* unspecified */,    // /* implementation-defined */
};

當使用launch::deferred時,只有future調用get或者wait方法時,才會異步直行可調用對象

cppreference

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

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

相關文章

Python 的字符串格式化指南

字符串格式化 Python 中控制字符串格式通常有三種形式&#xff1a; % 占位符&#xff08;格式化符&#xff09;str.format() 函數f-string 內嵌式 Python 最先開始格式化字符串是用 %&#xff0c;但它的致命缺點是支持的類型有限制&#xff0c;只支持 int&#xff0c;str&am…

【從零開始實現意圖識別】中文對話意圖識別詳解

前言 意圖識別&#xff08;Intent Recognition&#xff09;是自然語言處理&#xff08;NLP&#xff09;中的一個重要任務&#xff0c;它旨在確定用戶輸入的語句中所表達的意圖或目的。簡單來說&#xff0c;意圖識別就是對用戶的話語進行語義理解&#xff0c;以便更好地回答用戶…

XUbuntu22.04之解決gpg keyserver receive failed no data(一百九十三)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 人生格言&#xff1a; 人生…

DevExpress WinForms TreeMap組件,用嵌套矩形可視化復雜分層數據

DevExpress WinForms TreeMap控件允許用戶使用嵌套的矩形來可視化復雜的平面或分層數據結構。 DevExpress WinForms有180組件和UI庫&#xff0c;能為Windows Forms平臺創建具有影響力的業務解決方案。同時能完美構建流暢、美觀且易于使用的應用程序&#xff0c;無論是Office風…

中文rlhf數據集50w條數據解析

中文rlhf數據集50w條數據解析 解析代碼數據名代碼解析 解析代碼 import jieba from tqdm import tqdm import re import pandas as pd import numpy as npdef find_non_english_text(text):pattern re.compile(r[^a-zA-Z])return pattern.sub(, text)def find_chinese_text(t…

教育數字化轉型:塑造未來學習新范式

在國家教育數字化戰略行動指引下&#xff0c;我國正積極推動數字化賦能教育高質量發展&#xff0c;以塑造教育發展的新優勢。如今&#xff0c;隨著科技新基建的普及和數字化賦能教育的深入推進&#xff0c;未來的教育模型正在逐漸形成。 在新的教育模型中&#xff0c;數字化學…

算法基礎(python版本)

第二章 算法設計思想 一、搜索排序 1.排序算法 https://visualgo.net/zh/sorting (1)冒泡排序 # 思路&#xff1a; # (1)比較相鄰元素&#xff0c;如果第一個比第二個大&#xff0c;則交換他們 # (2)第一輪下來&#xff0c;可以保證最后一個數一定是最大的&#xff1b;第二…

2023最全的Web自動化測試介紹

做測試的同學們都了解&#xff0c;做Web自動化&#xff0c;我們主要用Selenium或者是QTP。 有的人可能就會說&#xff0c;我沒這個Java基礎&#xff0c;沒有Selenium基礎&#xff0c;能行嗎&#xff1f;測試雖然屬于計算機行業&#xff0c;但其實并不需要太深入的編程知識&…

介紹一個功能強大的shopify app——TINYIMG

各位觀眾老爺&#xff0c;南來的北往的&#xff0c;東去的西走的&#xff0c;今天給大家推薦一個功能很強大的shopify app 當當當 那就是 tinyimg 這個app有多牛逼呢&#xff0c;且聽我慢慢道來 首先這個app可以用來優化圖片大小&#xff0c;給你的網站提提速 然后這個app還可…

Android使用AIDL+MemoryFile傳遞大數據

Android進程間通信經常會使用AIDL&#xff0c;簡單方便&#xff0c;但是數據量有限制&#xff0c;超過一定值會報錯&#xff1a; E !!! FAILED BINDER TRANSACTION !!! (parcel size 2073744) 可以通過使用AIDLMemoryFile傳遞大數據 新建AIDL接口&#xff1a; interface On…

CCFCSP試題編號:201803-2試題名稱:碰撞的小球

一、題目描述 二、思路 1.首先妾身分析這個題目&#xff0c;想要解題&#xff0c;得得解決2個問題。 1&#xff09;判斷小球到達端點或碰撞然后改變方向&#xff1b; 2&#xff09;每時刻都要改變位置 兩個問題都比較好解決&#xff0c;1&#xff09;只要簡單判斷坐標&…

形態學操作—膨脹

在 OpenCV 中&#xff0c;圖像形態學操作是一組基于圖像形狀的處理技術&#xff0c;其中膨脹&#xff08;Dilation&#xff09;是其中之一。膨脹操作可用于圖像處理中的特征增強、去噪、分割和邊緣檢測等。其基本原理是利用結構元素&#xff08;Kernel 或 Structuring Element&…

Tomcat實現WebSocket即時通訊 Java實現WebSocket的兩種方式

HTTP協議是“請求-響應”模式&#xff0c;瀏覽器必須先發請求給服務器&#xff0c;服務器才會響應該請求。即服務器不會主動發送數據給瀏覽器。 實時性要求高的應用&#xff0c;如在線游戲、股票實時報價和在線協同編輯等&#xff0c;瀏覽器需實時顯示服務器的最新數據&#x…

UML建模圖文詳解教程06——順序圖

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文參考資料&#xff1a;《UML面向對象分析、建模與設計&#xff08;第2版&#xff09;》呂云翔&#xff0c;趙天宇 著 順序圖概述 順序圖(sequence diagram&#xff0c;也…

(三)C語言之for語句概述

&#xff08;三&#xff09;C語言之for語句概述 一、使用for語句實現打印華氏溫度與攝氏溫度轉換二、for語句概述三、練習 一、使用for語句實現打印華氏溫度與攝氏溫度轉換 #include <stdio.h> /*當華氏溫度為 0,20,40,...300時&#xff0c;打印出華氏溫度與攝氏溫度對照…

一個簡單的QT應用示例

一個簡單的QT應用示例&#xff1a;創建一個窗口程序。 首先&#xff0c;確保已經安裝了Qt開發環境。接下來&#xff0c;按照以下步驟創建一個簡單的窗口程序&#xff1a; 1. 打開Qt Creator&#xff0c;點擊“新建文件或項目”。 2. 選擇“應用程序”&#xff0c;然后點擊“下…

【MATLAB】根軌跡的繪制及rltool工具的使用

目錄 一、MATLAB中傳遞函數的表示二、rlocus函數繪制根軌跡1.常規根軌跡仿真示例2.參數根軌跡仿真示例3.零度根軌跡仿真示例 三、圖形化工具rltool介紹 一、MATLAB中傳遞函數的表示 在繪制系統的根軌跡之前&#xff0c;需要知道傳遞函數在matlab中如何表示。 在matlab中&#…

VOC數據集和COCO數據集直接的相互轉換

VOC數據集格式 get_list.py import os import random import shutil# 設置隨機種子 random.seed(1000)# 判斷Annotations和JpegImages是否對應 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

repo init報error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

repo init報error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 1 repo init出錯的信息2 解決方法 在ubuntu執行repo init的時候報了repo init報error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed這種錯誤&#xff0c;解決方法是需要更新本地…

PS給圖片增加一個白色邊框。

問題描述&#xff1a;PS如何給圖片增加一個白色邊框&#xff1f; 解決辦法&#xff1a; 第一步&#xff1a;使用shiftAltA快捷鍵&#xff0c;在圖片四周拉出一個灰白色的邊框。如下圖所示&#xff1a; 第二步&#xff0c;使用快捷鍵Ctrlshiftn新建一個圖層。 并把新建的圖層…