C++20 协程实现线程同步示例

C++20 协程实现线程同步示例


class Event
{
public:Event() = default;Event(const Event&) = delete;Event(Event&&) = delete;Event& operator=(const Event&) = delete;Event& operator=(Event&&) = delete;class Awaiter;Awaiter operator co_await() const noexcept;void notify() noexcept;private:friend class Awaiter;mutable std::atomic<void*> suspendedWaiter{nullptr};mutable std::atomic<bool> notified{false};
};class Event::Awaiter
{
public:Awaiter(const Event& eve): event(eve){}bool await_ready() const;bool await_suspend(std::coroutine_handle<> corHandle) noexcept;void await_resume() noexcept{}private:friend class Event;const Event& event;std::coroutine_handle<> coroutineHandle;
};bool Event::Awaiter::await_ready() const
{if (event.suspendedWaiter.load() != nullptr){throw std::runtime_error("无效");}return event.notified;
}bool Event::Awaiter::await_suspend(std::coroutine_handle<> corHandle) noexcept
{coroutineHandle = corHandle;if (event.notified) return false;event.suspendedWaiter.store(this);return true;
}void Event::notify() noexcept
{notified = true;auto* waiter = static_cast<Awaiter*>(suspendedWaiter.load());if (waiter != nullptr){waiter->coroutineHandle.resume();}
}Event::Awaiter Event::operator co_await() const noexcept
{return Awaiter{*this};
}struct Task
{struct promise_type{Task get_return_object() { return {}; }std::suspend_never initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void return_void(){}void unhandled_exception(){}};
};Task receiver(Event& event)
{auto start = std::chrono::high_resolution_clock::now();co_await event;std::cout << "获取通知" << std::endl;auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed = end - start;std::cout << std::format("等待 {} 秒\n", elapsed.count());
}using namespace std::chrono_literals;int main()
{std::cout << '\n';std::cout << "等待前通知" << '\n';Event event1{};auto senderThread1 = std::thread([&event1] { event1.notify(); }); // 通知auto receiverThread1 = std::thread(receiver, std::ref(event1));receiverThread1.join();senderThread1.join();std::cout << '\n';std::cout << "等待两秒后通知" << '\n';Event event2{};auto receiverThread2 = std::thread(receiver, std::ref(event2));auto senderThread2 = std::thread([&event2]{std::this_thread::sleep_for(2s);event2.notify(); // Notification});receiverThread2.join();senderThread2.join();std::cout << '\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react(93)--成功置空

//删除页面逻辑的封装deletePointsDefinition (list) > {this.props.dispatch({type: activity/deleteActivityPopup,payload: {codeList: list,},callback: (res) > {console.log(res, res);if (res.returnCode 0) {message.success(操作成功);\this.props.dispatch({…

给窗口设置系统级或窗口级的热键

开发环境&#xff1a;VS2005, C#语言 为了给一个程序加一个系统级的热键&#xff0c;在开发时需要使用到下面的代码&#xff0c;就是在程序中注册和卸载热键。 1。首先在Form1类的函数中添加如下代码&#xff1a; [DllImport("user32.dll")] private static…

Sublime Text 插件之常用20个插件

作为一个开发者你不可能没听说过 Sublime Text。不过你没听说过也没关系&#xff0c;下面让你明白。 Sublime Text是一款非常精巧的文本编辑器&#xff0c;适合编写代码、做笔记、写文章。它用户界面十分整洁&#xff0c;功能非同凡响&#xff0c;性能快得出奇。这些非常棒的特…

JUnit 4 与 JUnit 3

JUnit 是 Java? 语言事实上的 标准单元测试库。JUnit 4 是该库三年以来最具里程碑意义的一次发布。它的新特性主要是通过采用 Java 5 中的标记&#xff08;annotation&#xff09;而不是利用子类、反射或命名机制来识别测试&#xff0c;从而简化测试。在本文中&#xff0c;执着…

输出特殊形状的图形

输出如下面这种形状的图形&#xff1a; 4 3 7 2 6 9 1 5 8 10 C Code: #include<iostream> using namespace std; //N: 代表有多少行元素void Display(int N){ int i, j, v; if(N < 0) { cout<<"N must bigger than Zero(0)!"<<endl<&l…

整合quickx到普通cocos2dx

quickx是对cocos2dx的lua扩展&#xff0c;它做了一些C的扩展&#xff0c;同时还在lua做了一些封装&#xff0c; 让用lua开发cocos2dx更快&#xff0c;中文站http://quick.cocoachina.com/。 由于现在的项目对cocos2dx有一些修改&#xff0c;又想用到quickx的便捷&#xff0c;于…

react(94)--时间搜索传值规范

console.log(data, dataTime);let startTimeLong (data?.time && new Date(data?.time[0]).getTime()) || ;let endTimeLong (data?.time && new Date(data?.time[1]).getTime()) || ;this.setState({name: data?.name,startTimeLong,endTimeLong,pageI…

我的项目-财务系统

4 名称&#xff1a;财务管理系统 时间&#xff1a;2000 用时&#xff1a;3个月 vb6sqlserver7 独立完成 描述&#xff1a;包含凭证输入&#xff0c;审核&#xff0c;记帐&#xff0c;帐簿管理&#xff0c;自动转帐&#xff0c;会计报表等财务管理的整个流程。此项目在兖州…

对二维数组进行Zig-Zag扫描(C++)

对二维数组进行Zig-Zag扫描(C)&#xff0c;先自定义了一个类&#xff0c;类中有个函数Run()来实现这个扫描过程&#xff0c;二维数组是动态分配空间以及随机赋值的。 下图是Zig-Zag扫描方式&#xff1a; CZigZag.h: #include<iostream>using namespace std; typedef s…

Storing and Retrieving Images from SQL Server using Microsoft .NET

Storing and Retrieving Images from SQL Server using Microsoft .NET 原文 Storing and Retrieving Images from SQL Server using Microsoft .NET Download source - 19.6 KbIntroduction This article is about storing and retrieving images from database in Microsoft …

react(95)--外部定义变量

export const oneTab [{ name: 所有, code: },{ name: 草稿, code: 15973725291430011977912 },{ name: 已上架, code: 15973725579180011047799 },{ name: 已下架, code: 15973725862620011529122 }, ];

无钱生活的日子

无钱生活的日子——代腾飞 2007年9月5日 于成都无钱生活的日子心中的梦想俨然成为了一句空话无钱生活的日子每日计划着怎样不受饥饿的摧残而饱受尴尬无钱生活的日子就算是兄弟朋友也会给你奚落笑话无钱生活的日子我甚至不能尽孝回乡看我重病在床的妈心中只能增添一份惆怅的牵…

react(96)--switch做判断

list: (text, row) > {const list [];switch (row.status) {case COURSE_STATUS_UPSHEFF:list.push({ name: 查看详情, onClick: this.handleDetail });list.push({ name: 下架, onClick: this.handleUporDownsheff });break;case COURSE_STATUS_DOWNSHEFF:list.push({ nam…

flot绘制折线图

<!--请先确保你有jquery.js 和 jquery.flot.min.js--> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtm…

在dos下运行.exe程序(C++)

说明&#xff1a;在Dos下运行.exe程序(C) 先看C源文件&#xff1a; #include<iostream>using namespace std; void main(int argc, char * argv[]){ cout<<"argc "<<argc<<endl; for(int i 0; i < argc; i) cout<<argv[i]<…

react(97)--分支切换

# 1.查看所有分支 > git branch -a# 2.查看当前使用分支(结果列表中前面标*号的表示当前使用分支) > git branch# 3.切换分支 > git checkout 分支名

DataProcess-语义分割数据集中将原始数据划分为73比例

语义分割数据集中将原始数据划分为73比例 我们下载公开数据集的时候&#xff0c;经常所有的图片是在一起的&#xff0c;如果我们需要进行实验的话还是需要按照73的比例将数据集划分为训练集和测试集&#xff0c;这里我准备了一个脚本&#xff0c;大家只需要传入分割之后保存的…

提取二维矩阵中分块后指定的块

对一个二维矩阵I(NN)进行分块(块大小为nn),并提取其中第ii块中的元素 % 对二维矩阵I进行[n n]分块&#xff0c;取其中第ii块中的元素function x getBlock(I, n, ii) N size(I, 1); n1 N / n; n2 n * n; [a, b] ind2sub([n1 n1], ii); p (b-1) * n * (n1 *…

重构 改善既有代码的设计:代码的坏

以下内容来自<<重构 改善既有代码的设计>> 一、什么是重构 所谓重构(Refactoring)是这样一个过程&#xff1a;在不改变代码外在行为的前提下&#xff0c;对代码做出修改以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法&#xff0c;可以最…

手机软件测试资料

手机知识的介绍和测试基础&#xff0c;以及手机相关的介绍&#xff0c;最后是对手机软件测试工程师素质讲解&#xff0c;比较详细&#xff0c;非常值得初学者一看.资料下载请点击此处转载于:https://blog.51cto.com/218686/41416