日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C++ 之std::future:理解并掌握異步編程的利器

來源: 責編: 時間:2023-11-28 09:37:26 279觀看
導讀引言最近因為項目要求用c++,之前一直很討厭c++,沒辦法只能短時間彌補c++的知識,項目中要設計一個線程池,需要取線程池任務的執行結果,這里涉及到c++的future關鍵字,在這里做個總結。在C++的世界里,std::future是一種非常重要

引言

最近因為項目要求用c++,之前一直很討厭c++,沒辦法只能短時間彌補c++的知識,項目中要設計一個線程池,需要取線程池任務的執行結果,這里涉及到c++的future關鍵字,在這里做個總結。Gqs28資訊網——每日最新資訊28at.com

在C++的世界里,std::future是一種非常重要的工具,它讓我們能夠以異步的方式執行代碼,并在需要的時候獲取結果。隨著C++11標準的引入,std::future成為了C++標準庫的一部分,它為我們提供了強大的異步編程支持。Gqs28資訊網——每日最新資訊28at.com

Gqs28資訊網——每日最新資訊28at.com

std::future,基本概念

std::future是C++的一種模板類,它代表了一個異步操作的結果。通過使用std::future,我們可以將一個異步操作封裝成一個對象,然后在需要的時候獲取結果。通常,std::future是與另一個線程協同工作的結果。Gqs28資訊網——每日最新資訊28at.com

(1) 創建std::future對象Gqs28資訊網——每日最新資訊28at.com

使用std::async函數來創建一個異步操作,并返回一個std::future對象:Gqs28資訊網——每日最新資訊28at.com

std::future<int> fut = std::async(std::launch::async, [](){ /* 執行一些異步操作 */ });

這里使用std::async啟動了一個異步操作,并返回一個std::future對象。這個異步操作可以是任意的函數或可調用對象,而返回值則是該操作的返回值。Gqs28資訊網——每日最新資訊28at.com

(2) 獲取std::future的結果Gqs28資訊網——每日最新資訊28at.com

一旦異步操作完成,就可以通過調用std::future::get函數來獲取結果。例如:Gqs28資訊網——每日最新資訊28at.com

int result = fut.get(); // 阻塞等待結果并獲取

通過調用fut.get()來獲取異步操作的結果。如果結果還未就緒,調用get()將導致當前線程阻塞,直到結果就緒為止。Gqs28資訊網——每日最新資訊28at.com

(3) 異常處理Gqs28資訊網——每日最新資訊28at.com

當異步操作拋出異常時,我們可以使用std::future::get來獲取異常信息。例如:Gqs28資訊網——每日最新資訊28at.com

try {      fut.get(); // 獲取結果并處理異常  } catch (const std::exception& e) {      // 處理異常情況  }

通過調用fut.get()來獲取異步操作的結果。如果異步操作拋出了異常,那么這個異常將被傳遞給調用get()的線程,我們可以通過捕獲異常來處理這種情況。Gqs28資訊網——每日最新資訊28at.com

舉個栗子

定義一個簡單的任務類Task,它接受一個整數參數作為標識符,并在執行時計算該標識符的兩倍值并返回。然后,我們創建了一個包含4個任務的vector,并使用std::async函數將每個任務提交到線程池中。每個任務返回一個std::future<int>對象,代表了異步操作的結果。然后遍歷所有的std::future對象,并通過調用get()函數獲取結果。注意,調用get()函數會阻塞當前線程,直到結果就緒為止。最后,將每個任務的計算結果打印到終端。Gqs28資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <future>#include <vector>// 定義一個簡單的任務類class Task {public:    Task(int id) : id(id) {}    int operator()() {        // 執行一些異步操作        std::this_thread::sleep_for(std::chrono::seconds(2));        return result = id * 2; // 計算結果    }    int getResult() const {        return result;    }private:    int id; // 任務的標識符    int result; // 計算結果};int main() {    // 創建一個包含4個任務的向量    std::vector<Task> tasks = {Task(1), Task(2), Task(3), Task(4)};    // 創建一個線程池,并提交任務到線程池    std::vector<std::future<int>> futures;    for (auto& task : tasks) {        futures.push_back(std::async(std::launch::async, task));    }    // 遍歷未來的結果,并打印出來    for (auto& future : futures) {        std::cout << "Result: " << future.get() << std::endl; // 阻塞等待結果并獲取    }    return 0;}

使用g++編譯執行結果:因為future實現使用了pthread,所有編譯要帶上-lpthreadGqs28資訊網——每日最新資訊28at.com

Gqs28資訊網——每日最新資訊28at.com

總結

為什么關注 std::future呢?因為std::future 提供了一種高效的方式來處理異步操作,使得程序可以充分利用多核處理器和異步任務執行的優勢。通過使用 std::future,可以更輕松地實現并發性和異步性,提高程序的性能和響應能力。Gqs28資訊網——每日最新資訊28at.com

std::future 作為 C++ 中異步編程的關鍵部分,其內核實現涉及復雜的多線程和異步任務機制。理解其內部原理對于編寫高效、并發的程序至關重要。通過合理利用 std::future,能夠在保持代碼清晰易懂的同時,充分發揮異步編程的優勢。Gqs28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34687-0.htmlC++ 之std::future:理解并掌握異步編程的利器

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: PHP 8.3 正式發布!

下一篇: 用 Addon 增強 Node.js 和 Electron 應用的原生能力

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 沧州市| 焉耆| 龙州县| 改则县| 伊春市| 信宜市| 尉氏县| 朝阳市| 壶关县| 安宁市| 景宁| 双桥区| 嵊泗县| 抚宁县| 荣昌县| 榆中县| 景德镇市| 镇康县| 海兴县| 克东县| 渑池县| 基隆市| 肃南| 阳原县| 鹤岗市| 曲麻莱县| 黄骅市| 县级市| 莒南县| 佛教| 徐水县| 苏尼特左旗| 富顺县| 嘉荫县| 兰州市| 赤城县| 全南县| 丰原市| 星子县| 晋中市| 黑山县|