34、協程

在Linux系統中,協程是一種輕量級的線程,它們允許在多個任務之間切換,而不需要操作系統的線程調度。協程可以分為有棧協程和無棧協程,以及對稱協程和非對稱協程。

有棧協程

有棧協程每個協程都有自己的棧空間,允許協程在執行過程中保存局部變量和函數調用棧。切換協程時,保存和恢復整個棧的內容。

示例:

#include <ucontext.h>
#include <iostream>ucontext_t ctx_main, ctx_func;void func() {std::cout << "Inside coroutine\n";swapcontext(&ctx_func, &ctx_main);std::cout << "Back in coroutine\n";
}int main() {char stack[8192];getcontext(&ctx_func);ctx_func.uc_stack.ss_sp = stack;ctx_func.uc_stack.ss_size = sizeof(stack);ctx_func.uc_link = &ctx_main;makecontext(&ctx_func, func, 0);std::cout << "Starting coroutine\n";swapcontext(&ctx_main, &ctx_func);std::cout << "Back in main\n";swapcontext(&ctx_main, &ctx_func);std::cout << "Finished\n";return 0;
}

無棧協程

無棧協程不需要獨立的棧空間,通常通過狀態機實現。每次切換時,只保存和恢復必要的狀態信息。

示例:

#include <iostream>class Coroutine {
public:Coroutine() : state(0) {}bool resume() {switch (state) {case 0:std::cout << "Inside coroutine\n";state = 1;return true;case 1:std::cout << "Back in coroutine\n";state = 2;return true;case 2:return false;}return false;}private:int state;
};int main() {Coroutine coro;std::cout << "Starting coroutine\n";while (coro.resume());std::cout << "Finished\n";return 0;
}

對稱協程

對稱協程允許協程之間相互調用和切換,沒有主協程的概念。


非對稱協程

非對稱協程有一個主協程,其他協程只能返回到主協程,不能直接相互調用。


C++20的協程

C++20引入的協程是無棧協程,并且是非對稱協程。它們通過編譯器生成狀態機來管理協程的狀態。

示例:

#include <coroutine>
#include <iostream>struct ReturnObject {struct promise_type {ReturnObject get_return_object() { return {}; }std::suspend_never initial_suspend() { return {}; }std::suspend_never final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() {}};
};ReturnObject foo() {std::cout << "Inside coroutine\n";co_await std::suspend_always{};std::cout << "Back in coroutine\n";
}int main() {auto coro = foo();std::cout << "Starting coroutine\n";coro.resume();std::cout << "Finished\n";return 0;
}

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

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

相關文章

DeepSeek 賦能金融科技,重塑開放銀行生態新圖景

目錄 一、金融科技開放銀行生態建設的現狀與挑戰二、DeepSeek 技術解析2.1 DeepSeek 的技術原理與特點2.2 與其他相關技術的對比優勢 三、DeepSeek 在開放銀行生態建設中的具體應用場景3.1 智能客服與財富管理3.2 風控與合規管理3.3 生態協同與數據共享 四、DeepSeek 應用案例分…

【QT控件】輸入類控件詳解

目錄 一、QLineEdit 二、Text Edit 三、Combo Box 四、Spin Box 五、Date Edit & Time Edit 六、Dial 七、Slider QT專欄&#xff1a;QT_uyeonashi的博客-CSDN博客 一、QLineEdit QLineEdit 用來表示單行輸入框. 可以輸入一段文本, 但是不能換行 核心屬性 核心信號…

【Oracle】存儲過程

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 存儲過程基礎概述1.1 存儲過程的概念與特點1.2 存儲過程的組成結構1.3 存儲過程的優勢 2. 基礎存儲過程2.1 簡單存儲過程2.1.1 創建第一個存儲過程2.1.2 帶變量的存儲過程 2.2 帶參數的存儲過程2.2.1 輸入參…

【MATLAB代碼】制導方法介紹與例程——三點法|三維空間,動態目標導引(訂閱專欄后可直接查看源代碼)

三點法導引是一種導彈制導策略,通過計算導彈、目標和制導站之間的相對位置來確保導彈準確追蹤移動目標。該方法利用三角定位和動態調整,實時更新導彈的飛行路徑,以提高命中率,廣泛應用于軍事導彈和無人機等領域。文中有完整的matlab源代碼,訂閱專欄后即可查看 文章目錄 代…

Servlet 快速入門

文章目錄 概念SpringBoot 測試案例執行原理傳統 Servlet在 SpringBoot &#xff08;嵌入式 Tomcat Spring MVC&#xff09; 中請求從瀏覽器到業務代碼的完整步驟關鍵點流程圖 參考 概念 運行在服務器端的小程序&#xff0c; Servlet 就是一個接口&#xff0c;定義 Java 類被瀏…

Java 8 Stream API 入門到實踐詳解

一、告別 for 循環&#xff01; 傳統痛點&#xff1a; Java 8 之前&#xff0c;集合操作離不開冗長的 for 循環和匿名類。例如&#xff0c;過濾列表中的偶數&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…

黃柏基因組-小檗堿生物合成的趨同進化-文獻精讀142

Convergent evolution of berberine biosynthesis 小檗堿生物合成的趨同進化 摘要 小檗堿是一種有效的抗菌和抗糖尿病生物堿&#xff0c;主要從不同植物譜系中提取&#xff0c;特別是從小檗屬&#xff08;毛茛目&#xff0c;早期分支的真雙子葉植物&#xff09;和黃柏屬&…

機器學習14-遷移學習

遷移學習學習筆記 一、遷移學習概述 遷移學習是機器學習中的一個重要領域&#xff0c;它旨在解決當目標任務的訓練數據有限時&#xff0c;如何利用與目標任務相關但不完全相同的源任務數據來提高學習性能的問題。在現實世界中&#xff0c;獲取大量高質量的標注數據往往成本高…

013旅游網站設計技術詳解:打造一站式旅游服務平臺

旅游網站設計技術詳解&#xff1a;打造一站式旅游服務平臺 在互聯網與旅游業深度融合的時代&#xff0c;旅游網站成為人們規劃行程、預訂服務的重要工具。一個功能完備的旅游網站&#xff0c;通過用戶管理、訂單管理等核心模塊&#xff0c;實現用戶與管理員的高效交互。本文將…

量子計算+AI:特征選擇與神經網絡優化創新應用

在由玻色量子協辦的第二屆APMCM“五岳杯”量子計算挑戰賽中&#xff0c;來自北京理工大學的Q-Masterminds團隊摘取了銀獎。該團隊由北京理工大學張玉利教授指導&#xff0c;依托玻色量子550計算量子比特的相干光量子計算機&#xff0c;將量子計算技術集成到特征選擇和神經網絡剪…

Maven相關問題:jna版本與ES沖突 + aop失效

文章目錄 1、背景2、解決3、一點思考4、環境升級導致AOP失效5、okhttp Bean找不到6、總結 記錄一些Maven依賴相關的思考 1、背景 做一個監控指標收集&#xff0c;用一下jna依賴&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifact…

gitlab CI/CD本地部署配置

背景: 代碼管理平臺切換為公司本地服務器的gitlab server。為了保證commit的代碼至少編譯ok&#xff0c;也為了以后能拓展test cases&#xff0c;現在先搭建本地gitlab server的CI/CD基本的編譯job pipeline。 配置步驟&#xff1a; 先安裝gitlab-runner: curl -L "ht…

移除元素-JavaScript【算法學習day.04】

題目鏈接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一種思路 標簽&#xff1a;拷貝覆蓋 主要思路是遍歷數組 nums&#xff0c;每次取出的數字變量為 num&#xff0c;同時設置一個下標 ans 在遍歷過程中如果出現數字與需要移除的值不相同時&#xff…

leetcode sql50題

在中文站沒找到對應的集合&#xff0c;想來自己動手拷貝過來&#xff0c;方便大家面試復習用&#xff0c;對應英文站點&#xff1a; https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的產品 鏈接: https://leetcode.cn/problems/recyclable-and-low-fa…

Dynadot專業版郵箱工具指南(五):將域名郵箱添加至Outlook客戶端

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

【RTSP從零實踐】1、根據RTSP協議實現一個RTSP服務

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Python網頁數據抓取常用的庫及方法介紹

Python網頁數據抓取常用的庫及方法介紹 摘要:以下是Python網絡數據抓取常用的6個庫的詳細介紹,包括它們的概述以及每個庫中最常用的10個函數(如果某些庫常用函數不足10個,則列出所有常用函數)。每個函數都附帶功能描述、用法說明和使用示例。這些庫在網絡爬蟲、數據…

6.5 note

一個很有意思的dfs模擬題_前序遍歷 這個問題的話前置內容顯然是字典序&#xff0c;什么是字典序呢&#xff1f; 顧名思義&#xff0c;就是詞語在字典中的順序&#xff0c;也就是我們最常說的a,abandon,ability&#xff08;我記得前三個是這個&#xff09; 這是一種字符串之間比…

day027-Shell自動化編程-基礎

文章目錄 1. 修改vim配置文件自動添加注釋2. 故障案例&#xff1a;Windows上寫的Shell腳本上傳到Linux系統上運行報錯3. 腳本運行方法4. 變量4.1 普通變量4.2 環境變量4.3 特殊變量4.4 案例&#xff1a;書寫ping檢查腳本&#xff0c;檢查腳本傳入的第一個參數4.5 面試題&#x…

2025年滲透測試面試題總結-騰訊[實習]科恩實驗室-安全工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 騰訊[實習]科恩實驗室-安全工程師 一、網絡與協議 1. TCP三次握手 2. SYN掃描原理 3. HTTPS證書機制 二…