C++20的協程簡介

C++20 引入了協程(Coroutines),這是一種特殊的函數,它可以暫停執行并在之后恢復,而不是像普通函數那樣一旦返回就終止。協程的主要特點在于它能保留自身的執行狀態,這讓異步編程更加簡潔和直觀。以下是對 C++20 協程的詳細介紹:

關鍵概念

  • co_await:這是一個操作符,用于暫停協程的執行,直至等待的異步操作完成。當異步操作完成后,協程會恢復執行。
  • co_yield:此操作符用于暫停協程的執行,并返回一個值給調用者。協程之后可以繼續執行。
  • co_return:該操作符用于終止協程的執行,并返回一個值給調用者。

示例代碼

下面的代碼展示了一個簡單的 C++20 協程示例:

#include <coroutine>
#include <iostream>
#include <stdexcept>// 生成器類模板
template <typename T>
class Generator {
public:struct promise_type {T current_value;  // 當前生成的數值// 協程初始化時直接掛起(惰性執行)std::suspend_always initial_suspend() noexcept { return {}; }// 協程結束時保持掛起以便獲取最終結果std::suspend_always final_suspend() noexcept { return {}; }// 協程返回時調用(無返回值)void return_void() noexcept {}// 處理未捕獲的異常void unhandled_exception() { throw; }// 生成器構造入口Generator get_return_object() { return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};}// 定義 co_yield 行為std::suspend_always yield_value(T value) {current_value = value;return {};}};// 協程句柄std::coroutine_handle<promise_type> coro_handle;// 構造函數explicit Generator(std::coroutine_handle<promise_type> h) : coro_handle(h) {}// 析構時銷毀協程~Generator() { if (coro_handle) coro_handle.destroy(); }// 迭代器支持bool move_next() {if (!coro_handle.done()) {coro_handle.resume();return !coro_handle.done();}return false;}T current() const { return coro_handle.promise().current_value; }// 范圍遍歷支持struct Iter {Generator& gen;bool operator!=(std::nullptr_t) const { return gen.move_next(); }void operator++() {}T operator*() const { return gen.current(); }};Iter begin() { return Iter{*this}; }std::nullptr_t end() { return nullptr; }
};// 生成整數序列的協程函數
Generator<int> generate_sequence(int start, int end) {for (int i = start; i <= end; ++i) {co_yield i;  // 每次生成一個值并掛起}
}int main() {// 生成 1 到 10 的序列auto seq = generate_sequence(1, 10);// 遍歷輸出for (auto num : seq) {std::cout << num << " ";}// 輸出: 1 2 3 4 5 6 7 8 9 10
}

代碼解釋

  1. Task?結構體:它是協程的返回類型,包含了?promise_type?結構體,用于定義協程的行為。
  2. coroutineFunction?函數:這是一個協程函數,使用?co_await std::suspend_always{}?來暫停協程的執行,然后使用?co_return 42?來終止協程并返回值 42。
  3. main?函數:調用?coroutineFunction?函數獲取協程對象,然后調用?get?方法獲取協程的返回值并輸出。

這個示例只是一個簡單的演示,在實際應用中,協程通常會用于處理異步 I/O 操作,以提高程序的性能和響應能力。

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

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

相關文章

通過ansible+docker-compose快速安裝一主兩從redis+三sentinel

目錄 示例主機列表 架構參考 文件內容 安裝腳本 ansible變量&#xff0c;需修改 ansible配置文件和主機清單&#xff0c;需修改 運行方式 驗證故障轉移master 涉及redis鏡像和完整的腳本文件 示例主機列表 架構參考 文件內容 安裝腳本 #!/bin/bashset -e export pa…

Apache Arrow 使用

下述操作參考 Building Arrow C — Apache Arrow v20.0.0.dev267 安裝依賴組件 sudo apt-get install \build-essential \ninja-build \cmake 下載源碼 git clone --recursive --shallow-submodules gitgithub.com:apache/arrow.git 配置 創建build目錄并且進入 mkdir a…

玩轉大語言模型——使用華為官方MindIE-Server鏡像方式部署DeepSeek模型

系列文章目錄 玩轉大語言模型——使用langchain和Ollama本地部署大語言模型 玩轉大語言模型——三分鐘教你用langchain提示詞工程獲得貓娘女友 玩轉大語言模型——ollama導入huggingface下載的模型 玩轉大語言模型——langchain調用ollama視覺多模態語言模型 玩轉大語言模型—…

MCP項目開發-一個簡單的RAG示例

MCP項目開發-一個簡單的RAG示例 前言 前言 客戶端是基于官網的例子改的&#xff0c;模型改成了openai庫連接僅僅使用基礎的RAG流程作為一個演示&#xff0c;包含了以下步驟 query改寫搜索&#xff1a;使用google serper重排序&#xff1a;使用硅基流動的api 大模型api也使用…

Tire樹(字典樹)

理論 上圖是一棵Trie樹&#xff0c;表示了關鍵字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。從上圖可以歸納出Trie樹的基本性質&#xff1a; 根節點不包含字符&#xff0c;除根節點外的每一個子節點都包含一個字符。從根節點到某一個節點&…

厄瓜多爾主流收單方式:Pago Efectivo支付

PAGOEFECTIVO&#xff08;Pago Efectivo&#xff09;是秘魯主流的在線支付方式&#xff0c;由El Comercio Group開發&#xff0c;主要為用戶提供安全、便捷的在線支付解決方案&#xff0c;支持網銀和現金支付&#xff0c;適用于沒有信用卡或不愿透露銀行信息的消費者。 Pago Ef…

【文獻研究】含硼鋼中BN表面偏析對可鍍性的影響

《B 添加鋼的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰寫。研究聚焦 B 添加鋼在低露點退火時 BN 形成對鍍鋅性的影響&#xff0c;對汽車用高強度鋼鍍鋅工藝優化意義重大。通過多組對比實驗&#xff0c;結合多種分析手段&#xff0c;明確了相關因素…

語法: ptr=malloc(size)

MALLOC( ) 語法: ptrmalloc(size) 參數: size是一個整數,表示被分配的字節個數; 返回值: 如果允許的話,返回值是一個指向被分配存儲器的指針;否則的話, 返回值是一個非指針; 功能: 該函數用來分配一定大小的空間給一個對象,其大小為size,但該空間的值為不確定值; 有…

JavaScript創建對象與構造函數

目錄 創建對象 一、創建對象的 5 種核心方式 1. 對象字面量&#xff08;直接量&#xff09; 2. 使用 Object.create() 3. 工廠模式 4. 構造函數模式 5. ES6 class 語法&#xff08;語法糖&#xff09; 二、構造函數與 new 關鍵字 1. 構造函數的作用 2. 構造函數的特征…

AIDD-人工智能藥物設計-深度學習助力提高兒童低級別膠質瘤復發風險預測的準確性

深度學習助力提高兒童低級別膠質瘤復發風險預測的準確性 兒童低級別膠質瘤&#xff08;pLGG&#xff09;是一種常見于兒童患者中的腦腫瘤&#xff0c;盡管大多數時候被認為是良性腫瘤&#xff0c;但是它們仍然可能導致相關癥狀和并發癥的發生&#xff0c;包括但不限于頭疼、癲…

redis的數據類型(1)

https://redis.io/docs/latest/develop/data-types/strings/ 社區版支持&#xff1a; String&#xff0c;字符串 Hash&#xff0c;key-value格式 List&#xff0c;根據插入順序排序 Set&#xff0c;集合 Sorted set&#xff0c;有排序 Stream&#xff0c; Bitmap&#xff0c; …

Nacos配置中心使用

Nacos配置中心 Nacos除了可以做注冊中心,&#x1f517;Nacos下載和注冊中心教程,同樣可以做配置管理來使用。 一、統一配置管理 當微服務部署的實例越來越多&#xff0c;達到數十、數百時&#xff0c;逐個修改微服務配置就顯得十分的不方便&#xff0c;而且很容易出錯。我們…

OpenCV輪廓檢測全面解析:從基礎到高級應用

一、概述 輪廓檢測是計算機視覺中的基礎技術&#xff0c;用于識別和提取圖像中物體的邊界。與邊緣檢測不同&#xff0c;輪廓檢測更關注將邊緣像素連接成有意義的整體&#xff0c;形成封閉的邊界。 輪廓檢測的核心價值 - 物體識別&#xff1a;通過輪廓可以識別圖像中的獨立物體…

Jenkins學習(B站教程)

文章目錄 1.持續集成CI2.持續交付CD3.持續部署4.持續集成的操作流程5.jenkins簡介6.后續安裝部署&#xff0c;見視頻 bilibili視頻 Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…

ARM-UART

時鐘選擇PLCK,超時3ms自動發送&#xff0c;設置發送8位的緩沖區&#xff0c;且發送中斷 設置觸發深度&#xff0c;達到8字節將緩沖區數據發憷 中斷處理函數

Rust所有權詳解

文章目錄 Rust所有權所有權規則作用域 內存和分配移動與克隆棧空間堆空間 關于函數的所有權機制作為參數作為返回值 引用與租借垂懸引用 Rust所有權 C/C中我們對于堆內存通常需要自己手動管理&#xff0c;手動申請和釋放&#xff0c;即便有了智能指針&#xff0c;對于效率的影…

【在線OJ項目測試報告】

朋友們、伙計們&#xff0c;我們又見面了&#xff0c;本期來給大家帶來關于在線OJ項目的測試報告&#xff0c;如果看完之后對你有一定的啟發&#xff0c;那么請留下你的三連&#xff0c;祝大家心想事成&#xff01; C 語 言 專 欄&#xff1a;C語言&#xff1a;從入門到精通 數…

【HFP】藍牙HFP應用層核心技術研究

免提配置文件(Hands-Free Profile, HFP)作為實現設備間音頻通信的關鍵協議,廣泛應用于車載系統、藍牙耳機等場景。本文將基于最新技術規范,深入剖析HFP應用層的功能要求、協議映射及編解碼器支持,為藍牙開發工程師提供詳盡的技術指南。 一、HFP應用層功能全景圖 HFP定義…

橫掃SQL面試——PV、UV問題

&#x1f4ca; 橫掃SQL面試&#xff1a;UV/PV問題 &#x1f31f; 什么是UV/PV&#xff1f; 在數據領域&#xff0c;UV&#xff08;Unique Visitor&#xff0c;獨立訪客&#xff09; 和 PV&#xff08;Page View&#xff0c;頁面訪問量&#xff09; 是最基礎也最重要的指標&…

【C++】第八節—string類(上)——詳解+代碼示例

hello&#xff0c;又見面了&#xff01; 云邊有個稻草人-CSDN博客 C_云邊有個稻草人的博客-CSDN博客——C專欄&#xff08;質量分高達97&#xff01;&#xff09; 菜鳥進化中。。。 目錄 一、為什么要學習string類&#xff1f; 1.1 C語言中的字符串 1.2 面試題(暫不做講解) …