C++并發多線程--std::async、std::packaged_task和std::promise的使用

目錄

1--std::async的使用

2--std::packaged_task的使用

3--std::promise的使用


1--std::async的使用

????????std::async用于啟動一個異步任務,并返回一個std::future對象;std::future對象里含有異步任務線程入口函數的結果;

????????std::launch::deferred 表示調用線程入口函數將會被延遲到 std::future 的 wait() 或 get() 調用,當 wait() 或者 get() 沒有被調用時,線程入口函數不會被調用(線程不會被創建);

#include <iostream>
#include <thread>
#include <mutex>
#include <future>class Sample{
public:// 線程入口函數int thread(int value){std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::chrono::microseconds dura(value); // reststd::this_thread::sleep_for(dura);return 5;}};int main(int argc, char *argv[]){Sample sample;int value = 5000;// std::async用于啟動一個異步任務,并返回一個std::future對象// std::future對象里含有異步任務線程入口函數的結果std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::future<int> result = std::async(&Sample::thread, &sample, value);// std::launch::deferred 表示調用線程入口函數將會被延遲到 std::future 的wait()或get()調用// 當wait()或者get()沒有被調用時,線程入口函數不會被調用(線程不會被創建)// std::future<int> result = std::async(std::launch::deferred, &Sample::thread, &sample, value);// result.get()等待thread()執行完畢獲取結果后,主線程才繼續往下執行std::cout << "resule.get(): " << result.get() << std::endl; // result.wait() // 等待線程返回,但不返回結果std::cout << "main thread continue ..." << std::endl;return 0;
}

2--std::packaged_task的使用

????????std::packaged_task 用于打包任務,其包裝各種可調用對象,方便后續作為線程入口函數;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>// 線程入口函數
int thread(int value){std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::chrono::microseconds dura(value); // reststd::this_thread::sleep_for(dura);return 5;
}int main(int argc, char *argv[]){// std::packaged_task 用于打包任務,其包裝各種可調用對象,方便后續作為線程入口函數std::cout << "thead id: " << std::this_thread::get_id() << std::endl;std::packaged_task<int(int)> mypt(thread);int value = 5000;std::thread thread1(std::ref(mypt), value);thread1.join();std::future<int> result = mypt.get_future();std::cout << "result.get(): " << result.get() << std::endl;return 0;
}

3--std::promise的使用

????????std::promise 用于在其他線程中使用某個線程中的值;在下面的實例代碼中,thread2 使用了?thread1 中的 result 值;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>// 線程入口函數
int thread(std::promise<int> &tmpp, int clac){clac++;clac *= 10; std::cout << "thread id: " << std::this_thread::get_id() << std::endl;int result = clac;tmpp.set_value(result);return 0;
}void thread_2(std::future<int> &tmpf){auto result2 = tmpf.get();std::cout << "tmpf.get(): " << result2 << std::endl;
}int main(int argc, char *argv[]){// std::promise 用于在某個線程中賦值,并在其他線程中將值取來用std::cout << "thead id: " << std::this_thread::get_id() << std::endl;std::promise<int> prom; int clac = 1;std::thread thread1(thread, std::ref(prom), clac);thread1.join();// 將promise中的值取來用std::future<int> result = prom.get_future();std::thread thread2(thread_2, std::ref(result));thread2.join();return 0;
}

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

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

相關文章

完美解決微信小程序使用復選框van-checkbox無法選中

由于小程序使用了vant-ui框架&#xff0c;導致checkbox點擊無法選中問題 <van-checkbox value"{{ checked }}" shape"square"><view class"check-content"><view class"checktext">我已閱讀并同意>《用戶協議》…

opencv-目標追蹤

import argparse import time import cv2 import numpy as np# 配置參數 ap argparse.ArgumentParser() ap.add_argument("-v", "--video", typestr,help"path to input video file") ap.add_argument("-t", "--tracker", …

第1天----驗證一個字符串是否是另一個字符串的子串

本文我們將學習如何去驗證一個字符串是否是另一個字符串的子串。 一、小試牛刀&#xff1a; 題目描述 輸入兩個字符串&#xff0c;驗證其中一個串是否為另一個串的子串。 輸入格式 兩行&#xff0c;每行一個字符串。 輸出格式 若第一個串 s 1 是第二個串 s 2 的子串&#xff0c…

java Spring Boot properties多環境配置拆分文件管理

上文 java Spring Boot yml多環境拆分文件管理優化 我們用yml 做了一個多環境配置文件的拆分管理 我們將 application.yml 改為 application.properties 參考代碼如下 spring.profiles.activedev我們知道 yml 是用 : 來區分高低基本 而 properties是直接通過 . 來表達 其他基本…

使用svd 分解的方法對神經網絡模型進行壓縮(能不能壓縮要看秩的大小)

參考和理論 壓縮原理代碼 import torch import numpy as np torch.manual_seed(0)# ------------------------------------ # n:輸入數據維度 # m:輸出數據維度 # ------------------------------------ n = 12 m = 10# ------------------------------------ # 隨機初始化權…

樹形組件淺知

別人寫好的輪子&#xff0c;會用即可 首先&#xff0c;需要安裝依賴&#xff0c;npm install --save riophae/vue-treeselect 如果使用npm 不行 那么就使用 yarn add --save riophae/vue-treeselect 然后在使用的地方引入即可 // import the componentimport Treeselect from…

微信ipad協議8.0.40 加好友功能

友情鏈接 geweapi.com 點擊即可訪問&#xff01; 好友請求驗證 小提示&#xff1a; v_3 v_4 可以參考 搜索接口 請求URL&#xff1a; http://域名地址/api/contacts/verifyuser 請求方式&#xff1a; POST 請求頭&#xff1a; Content-Type&#xff1a;application/js…

SpringCloud實用篇7——深入elasticsearch

目錄 1 數據聚合1.1 聚合的種類1.2 DSL實現聚合1.2.1 Bucket聚合語法1.2.2 聚合結果排序1.2.3 限定聚合范圍1.2.4 Metric聚合語法1.2.5.小結 1.3 RestAPI實現聚合1.3.1 API語法1.3.2 業務需求1.3.3 業務實現 2 自動補全2.1 拼音分詞器2.2 自定義分詞器2.3 自動補全查詢2.4 實現…

POJ 1995 Raising Modulo Numbers 快速冪

一、總結 我一開始擔心溢出&#xff0c;開了一個無符號的long long&#xff0c;但是直接超時&#xff0c;后來一看它的mod不是很大&#xff0c;于是改成int&#xff0c;直接過了。 二、代碼 #include <iostream> using namespace std; int H, Z; int M; int mulMod(in…

P1217 [USACO1.5] 回文質數 Prime Palindromes

P1217 [USACO1.5] 回文質數 Prime Palindromes - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) # [USACO1.5] 回文質數 Prime Palindromes ## 題目描述 因為 $151$ 既是一個質數又是一個回文數&#xff08;從左到右和從右到左是看一樣的&#xff09;&#xff0c;所以 $151$ …

Python基礎教程:私有變量的訪問和賦值教程

嗨嘍~大家好呀&#xff0c;這里是魔王吶 ? ~! 首先我們這里先描述下&#xff1a; Python中&#xff0c;變量名類似__x__的&#xff0c;以雙下劃線開頭&#xff0c;并且以雙下劃線結尾的&#xff0c;是特殊變量&#xff0c;特殊變量是可以直接訪問的&#xff08;比如 doc, __i…

SpringBoot3集成ElasticSearch

標簽&#xff1a;ElasticSearch8.Kibana8&#xff1b; 一、簡介 Elasticsearch是一個分布式、RESTful風格的搜索和數據分析引擎&#xff0c;適用于各種數據類型&#xff0c;數字、文本、地理位置、結構化數據、非結構化數據&#xff1b; 在實際的工作中&#xff0c;歷經過Ela…

南大通用數據庫(gbase 8s) 在Centos7環境 集群安裝

國產數據庫-達夢 一、環境詳情二、Centos7 參數優化&#xff08;所有節點&#xff09;三、創建gbase用戶&#xff08;所有節點&#xff09;四、 安裝部署&#xff0c;只在node1 安裝即可同步五、數據庫卸載六、數據庫連接與使用 當前安裝 在指定版本環境下 測試&#xff0c;僅供…

QT的設計器介紹

設計器介紹 Qt制作 UI 界面&#xff0c;一般可以通過UI制作工具QtDesigner和純代碼編寫兩種方式來實現。純代碼實現暫時在這里不闡述了在后續布局章節詳細說明&#xff0c;QtDesigner已經繼承到開發環境中&#xff0c;在工程中直接雙擊ui文件就可以直接在QtDesigner設計器中打…

【100天精通python】Day39:GUI界面編程_PyQt 從入門到實戰(下)_圖形繪制和動畫效果,數據可視化,刷新交互

目錄 專欄導讀 6 圖形繪制與動畫效果 6.1 繪制基本圖形、文本和圖片 6.2 實現動畫效果和過渡效果 7 數據可視化 7.1 使用 Matplotlib繪制圖表 7.2 使用PyQtGraph繪制圖表 7.3 數據的實時刷新和交互操作 7.3.1 數據的實時刷新 7.3.2 交互操作 7.4 自定義數據可視化…

C# 窗體永遠在最前

C# 窗體永遠在最前 1、調用系統API public const int HWND_TOP 0;public const int HWND_BOTTOM 1;public const int HWND_TOPMOST -1;public const int HWND_NOTOPMOST -2;//設置此窗體為活動窗體&#xff1a;//將創建指定窗口的線程帶到前臺并激活該窗口。鍵盤輸入直接指…

【WPF】 本地化的最佳做法

【WPF】 本地化的最佳做法 資源文件英文資源文件 en-US.xaml中文資源文件 zh-CN.xaml 資源使用App.xaml主界面布局cs代碼 App.config輔助類語言切換操作類資源 binding 解析類 實現效果 應用程序本地化有很多種方式&#xff0c;選擇合適的才是最好的。這里只討論一種方式&#…

Unity制作一個簡單的登入注冊頁面

1.創建Canvas組件 首先我們創建一個Canvas畫布&#xff0c;我們再在Canvas畫布底下創建一個空物體&#xff0c;取名為Resgister。把空物體的錨點設置為全屏撐開。 2.我們在Resgister空物體底下創建一個Image組件&#xff0c;改名為bg。我們也把它 的錨點設置為全屏撐開狀態。接…

【深入理解ES6】字符串和正則表達式

概念 字符串&#xff08;String&#xff09;是JavaScript6大原始數據類型。其他幾個分別是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16碼位 字符串里的字符有兩種&#xff1a; 前 個碼位均以16位的編碼單元…