国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c++ 20 協(xié)程例子

這篇具有很好參考價(jià)值的文章主要介紹了c++ 20 協(xié)程例子。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

#include <chrono>
#include <coroutine>
#include <functional>
#include <iostream>
#include <queue>
#include <string>
#include <thread>

using task = std::function<void(const std::string&)>;

class executor {
private:
? ? std::thread work_thread_;
? ? std::queue<task> tasks_;

public:
? ? void add_task(task t) { tasks_.emplace(std::move(t)); }

? ? void run() {
? ? ? ? work_thread_ = std::thread([this]() {
? ? ? ? ? ? uint64_t times = 1;
? ? ? ? ? ? std::cout << "executor thread: " << std::this_thread::get_id() << "\n";
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? auto& task = tasks_.front();
? ? ? ? ? ? ? ? task(std::to_string(times));
? ? ? ? ? ? ? ? times++;
? ? ? ? ? ? ? ? tasks_.pop();

? ? ? ? ? ? ? ? using namespace std::chrono_literals;
? ? ? ? ? ? ? ? std::this_thread::sleep_for(1000ms);
? ? ? ? ? ? }
? ? ? ? ? ? });

? ? ? ? if (work_thread_.joinable()) {
? ? ? ? ? ? work_thread_.join();
? ? ? ? }
? ? }
};

class coroutine_task {
public:
? ? struct promise_type {
? ? ? ? std::suspend_never initial_suspend() noexcept { return {}; }

? ? ? ? std::suspend_always final_suspend() noexcept { return {}; }

? ? ? ? void unhandled_exception() noexcept {}

? ? ? ? coroutine_task get_return_object() noexcept {
? ? ? ? ? ? auto tk = coroutine_task{
? ? ? ? ? ? ? ? std::coroutine_handle<promise_type>::from_promise(*this) };
? ? ? ? ? ? return tk;
? ? ? ? }

? ? ? ? /*void return_value(int v) noexcept {}*/
? ? ? ? void return_void() noexcept {}

? ? ? ? std::suspend_always yield_value(std::string&& from) noexcept {
? ? ? ? ? ? value_ = std::move(from);
? ? ? ? ? ? return {};
? ? ? ? }

? ? ? ? std::string value_;
? ? };

private:
? ? std::coroutine_handle<promise_type> coro_;

public:
? ? coroutine_task(std::coroutine_handle<promise_type> h) : coro_(h) {}

? ? ~coroutine_task() {
? ? ? ? if (coro_) {
? ? ? ? ? ? coro_.destroy();
? ? ? ? }
? ? }

? ? std::string value() { return coro_.promise().value_; }
};

template <typename R, typename Executor = executor>
struct awaitable {
private:
? ? R buf_;
? ? Executor& e_;
? ? std::coroutine_handle<> coro_handle_;

public:
? ? awaitable(Executor& e) : e_(e) {}

? ? bool await_ready() noexcept { return false; }

? ? R await_resume() noexcept { return buf_; }

? ? void await_suspend(std::coroutine_handle<> p) noexcept {
? ? ? ? coro_handle_ = p;
? ? }

? ? void async_start() {
? ? ? ? e_.add_task([this](const R& times) {
? ? ? ? ? ? std::cout << "async resume thread: " << std::this_thread::get_id() << "\n";
? ? ? ? ? ? buf_ = times;
? ? ? ? ? ? coro_handle_.resume();
? ? ? ? ? ? });
? ? }
};

auto async_read(executor& e) {
? ? awaitable<std::string> aw{ e };
? ? aw.async_start();
? ? return aw;
}

coroutine_task coro_read1(executor& e) {
? ? std::cout << "coro_read1 begin thread: " << std::this_thread::get_id() << "\n";
? ? for (;;) {
? ? ? ? auto value = co_await async_read(e);
? ? ? ? std::cout << "1、coro_read1: " << value << " thread: " << std::this_thread::get_id() << "\n";
? ? ? ? value = co_await async_read(e);
? ? ? ? std::cout << "2、coro_read1: " << value << " thread: " << std::this_thread::get_id() << "\n";
? ? }
}

coroutine_task coro_read2(executor& e) {
? ? std::cout << "coro_read2 begin thread: " << std::this_thread::get_id() << "\n";
? ? for (;;) {
? ? ? ? auto value = co_await async_read(e);
? ? ? ? std::cout << "coro_read2: " << value << " thread: " << std::this_thread::get_id() << "\n";
? ? }
}

int main() {
? ? executor e;

? ? auto cr1 = coro_read1(e);
? ? auto cr2 = coro_read2(e);

? ? e.run();
? ? return 0;
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-851968.html

到了這里,關(guān)于c++ 20 協(xié)程例子的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Modern C++ 一個(gè)例子學(xué)習(xí)條件變量

    Modern C++ 一個(gè)例子學(xué)習(xí)條件變量

    目錄 問(wèn)題程序 施魔法讓BUG浮出水面 條件變量注意事項(xiàng) 修改程序 今天無(wú)意中看到一篇帖子,關(guān)于條件變量的,不過(guò)仔細(xì)看看發(fā)現(xiàn)它并達(dá)不到原本的目的。 程序如下,讀者可以先想想他的本意,以及有沒有問(wèn)題: OK,本意顯然是: 從1開始打印整數(shù) 線程t1, 打印非5的倍數(shù) 線程

    2024年01月20日
    瀏覽(18)
  • Rust實(shí)戰(zhàn)(4):防御簡(jiǎn)單C++ vector容器的越界問(wèn)題例子分析

    這是一個(gè)C++的簡(jiǎn)單vector容器的越界問(wèn)題的小例子: func1.h func1.cpp 上面的代碼是刻意制造出來(lái)的,用一個(gè)測(cè)試代碼說(shuō)明問(wèn)題: 程序輸出: 這個(gè)代碼在Mac OS 系統(tǒng)上 make 后運(yùn)行沒有崩潰,但是測(cè)試代碼里 std::string ret2 = sv.getElement(11); 實(shí)際上發(fā)生了數(shù)組越界。 在rust環(huán)境下創(chuàng)建一個(gè)

    2024年02月16日
    瀏覽(16)
  • 數(shù)字圖像處理第三章 學(xué)習(xí)筆記附部分例子代碼(C++ & opencv)

    數(shù)字圖像處理第三章 學(xué)習(xí)筆記附部分例子代碼(C++ & opencv)

    本系列博客參考書為, 數(shù)字圖像處理第三版-岡薩雷斯 第三版教材中圖片下載地址: book images downloads vs2019配置opencv可以查看:VS2019 Opencv4.5.4配置教程 后續(xù)劇情: 數(shù)字圖像處理 第四章 頻率域?yàn)V波 學(xué)習(xí)筆記 數(shù)字圖像處理 第六章 彩色圖像處理 學(xué)習(xí)筆記 數(shù)字圖像處理 第七章 小

    2024年02月03日
    瀏覽(32)
  • C++ 20 Module

    C++ 20 Module

    頭文件包含一直是C/C++的傳統(tǒng),它使代碼聲明與實(shí)現(xiàn)分離,但它有一個(gè)非常大的問(wèn)題就是會(huì)被重復(fù)編譯,拖累編譯速度。 通常一個(gè)標(biāo)準(zhǔn)頭文件 iostream 展開后可能達(dá)幾十萬(wàn)甚至上百萬(wàn)行。筆者使用下面的示例進(jìn)行測(cè)試,新建一個(gè) main.cc ,內(nèi)容如下: 然后分別使用g++和clang++來(lái)測(cè)

    2024年01月23日
    瀏覽(11)
  • C++(20):range

    C++20提供了range來(lái)簡(jiǎn)化對(duì)迭代器的使用,可以認(rèn)為range是一個(gè)封裝了begin和end的對(duì)象。 template?class?T? concept range?=?requires(?T?t?)?{ ??ranges::begin(t);?// equality-preserving for forward iterators ??ranges::end??(t); }; 而對(duì)于end,range將它認(rèn)為是迭代器哨位,并不要求end一定是一個(gè)跟begin相同

    2024年02月13日
    瀏覽(9)
  • C++(20):using enum

    C++(11):枚舉類_c++11 枚舉類_風(fēng)靜如云的博客-CSDN博客 ?雖然枚舉類有很多有點(diǎn),不過(guò)如果每次使用都需要帶上枚舉類的類名,那么使用起來(lái)還是稍有些不便,C++20對(duì)此進(jìn)行優(yōu)化,可以通過(guò)using enum在一定的作用域內(nèi)開放枚舉類成員的使用: 可以看到當(dāng)使用using enum聲明了枚舉類后

    2023年04月12日
    瀏覽(14)
  • C++ 筆記 20 (STL函數(shù)對(duì)象)

    1. 函數(shù)對(duì)象 1.1 函數(shù)對(duì)象概念 概念: 重載 函數(shù)調(diào)用操作符 的類,其對(duì)象常稱為函數(shù)對(duì)象; 函數(shù)對(duì)象使用重載的()時(shí),行為類似函數(shù)調(diào)用,也叫仿函數(shù)。 本質(zhì): 函數(shù)對(duì)象(仿函數(shù))是一個(gè)類,不是一個(gè)函數(shù)。 1.2 函數(shù)對(duì)象的使用 特點(diǎn): 函數(shù)對(duì)象在使用時(shí),可以像普通函數(shù)

    2024年02月02日
    瀏覽(26)
  • C++設(shè)計(jì)模式20:狀態(tài)模式

    C++ 23種設(shè)計(jì)模式系列文章目錄 創(chuàng)建型模式 第1式 工廠方法模式 第2式 抽象工廠模式 第3式 單例模式 第4式 建造者模式 第5式 原型模式 結(jié)構(gòu)型模式 第6式 適配器模式 第7式 橋接模式 第8式 組合模式

    2024年02月02日
    瀏覽(12)
  • C++語(yǔ)法(20)---- 模擬紅黑樹

    C++語(yǔ)法(20)---- 模擬紅黑樹

    C++語(yǔ)法(19)---- 模擬AVL樹_哈里沃克的博客-CSDN博客 https://blog.csdn.net/m0_63488627/article/details/130229501?spm=1001.2014.3001.5501 目錄 1.紅黑樹介紹 2.模擬實(shí)現(xiàn) 1.枚舉紅黑顏色 2.節(jié)點(diǎn)的定義 3.樹類框架 4.插入 5.檢查 3.代碼實(shí)現(xiàn) 最長(zhǎng)路徑不超過(guò)最短路徑的兩倍,近似平衡 最短:全黑 最長(zhǎng):

    2024年02月01日
    瀏覽(15)
  • C++(20):多重繼承與虛繼承

    C++(20):多重繼承與虛繼承

    多重繼承 是指從多個(gè)直接基類中產(chǎn)生派生類的能力。多重繼承的派生類繼承了所有父類的屬性。 在派生類的派生列表中可以包含多個(gè)基類: 每個(gè)基類包含一個(gè)可選的訪問(wèn)說(shuō)明符。如果說(shuō)明符被忽略掉了,則 class 對(duì)應(yīng)的默認(rèn)訪問(wèn)說(shuō)明符是 private , struct 對(duì)應(yīng)的是

    2024年02月10日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包