当前位置: 首页 > news >正文

C++ 协程

经典协程辅助入门代码:

typedef cotask::task my_task_t;

int main() {

// create a task using factory function [with lambda expression]

my_task_t::ptr_t task = my_task_t::create([]() { //创建协程

std::cout ()->get_id()

cotask::this_task::get_task()->yield();

std::cout ()->get_id()

// ! Make crash and it's will generate a mini dump into d:/libcopp-test-minidump-*.dmp

// copp::this_coroutine::get_coroutine()->yield();

return 0;

});

std::cout get_id()

// start a task

task->start();

std::cout get_id()

task->resume();

std::cout get_id()

return 0;

}

Task切换式:

/*

* sample_stress_test_task.cpp

*

* Created on: 2014年5月11日

* Author: owent

*

* Released under the MIT license

*/

#include

#include

#include

#include

#include

#include

#include

// include manager header file

#include

#define LIBCOTASK_MACRO_ENABLED

#ifdef LIBCOTASK_MACRO_ENABLED

# if defined(PROJECT_LIBCOPP_SAMPLE_HAS_CHRONO) && PROJECT_LIBCOPP_SAMPLE_HAS_CHRONO

# include

# define CALC_CLOCK_T std::chrono::system_clock::time_point

# define CALC_CLOCK_NOW() std::chrono::system_clock::now()

# define CALC_MS_CLOCK(x) static_cast(std::chrono::duration_cast(x).count())

# define CALC_NS_AVG_CLOCK(x, y) \

static_cast(std::chrono::duration_cast(x).count() / (y ? y : 1))

# else

# define CALC_CLOCK_T clock_t

# define CALC_CLOCK_NOW() clock()

# define CALC_MS_CLOCK(x) static_cast((x) / (CLOCKS_PER_SEC / 1000))

# define CALC_NS_AVG_CLOCK(x, y) (1000000LL * static_cast((x) / (CLOCKS_PER_SEC / 1000)) / (y ? y : 1))

# endif

typedef cotask::task<> my_task_t;

int switch_count = 100;

int max_task_number = 100000; // 协程Task数量

std::vector task_arr;

// define a coroutine runner

static int my_task_action(void *) {

// ... your code here ...

int count = switch_count; // 每个task地切换次数

cotask::impl::task_impl *self = cotask::this_task::get_task();

while (count-- > 0) {

self->yield();

}

return 0;

}

int main(int argc, char *argv[]) {

# ifdef LIBCOPP_MACRO_SYS_POSIX

puts("###################### context coroutine (stack using default allocator[mmap]) ###################");

# elif defined(LIBCOPP_MACRO_SYS_WIN)

puts("###################### context coroutine (stack using default allocator[VirtualAlloc]) ###################");

# else

puts("###################### context coroutine (stack using default allocator ###################");

# endif

printf("########## Cmd:");

for (int i = 0; i < argc; ++i) {

printf(" %s", argv[i]);

}

puts("");

if (argc > 1) {

max_task_number = atoi(argv[1]);

}

if (argc > 2) {

switch_count = atoi(argv[2]);

}

size_t stack_size = 16 * 1024;

if (argc > 3) {

stack_size = atoi(argv[3]) * 1024;

}

time_t begin_time = time(nullptr);

CALC_CLOCK_T begin_clock = CALC_CLOCK_NOW();

// create coroutines

task_arr.reserve(static_cast(max_task_number));

while (task_arr.size() < static_cast(max_task_number)) {

my_task_t::ptr_t new_task = my_task_t::create(my_task_action, stack_size);

if (!new_task) {

fprintf(stderr, "create coroutine task failed, real size is %d.\n", static_cast(task_arr.size()));

fprintf(stderr, "maybe sysconf [vm.max_map_count] extended.\n");

max_task_number = static_cast(task_arr.size());

break;

}

task_arr.push_back(new_task);

}

time_t end_time = time(nullptr);

CALC_CLOCK_T end_clock = CALC_CLOCK_NOW();

printf("create %d task, cost time: %d s, clock time: %d ms, avg: %lld ns\n", max_task_number,

static_cast(end_time - begin_time), CALC_MS_CLOCK(end_clock - begin_clock),

CALC_NS_AVG_CLOCK(end_clock - begin_clock, max_task_number));

begin_time = end_time;

begin_clock = end_clock;

// start a task

for (int i = 0; i < max_task_number; ++i) {

task_arr[i]->start();

}

// yield & resume from runner

bool continue_flag = true;

long long real_switch_times = static_cast(0);

while (continue_flag) {

continue_flag = false;

for (int i = 0; i < max_task_number; ++i) {

if (false == task_arr[i]->is_completed()) { //查询任务是否结束完成,采用while+for的方式进行多次检查,

continue_flag = true;

++real_switch_times;

task_arr[i]->resume();

}

}

}

end_time = time(nullptr);

end_clock = CALC_CLOCK_NOW();

printf("switch %d tasks %lld times, cost time: %d s, clock time: %d ms, avg: %lld ns\n", max_task_number,

real_switch_times, static_cast(end_time - begin_time), CALC_MS_CLOCK(end_clock - begin_clock),

CALC_NS_AVG_CLOCK(end_clock - begin_clock, real_switch_times));

begin_time = end_time;

begin_clock = end_clock;

task_arr.clear();

end_time = time(nullptr);

end_clock = CALC_CLOCK_NOW();

printf("remove %d tasks, cost time: %d s, clock time: %d ms, avg: %lld ns\n", max_task_number,

static_cast(end_time - begin_time), CALC_MS_CLOCK(end_clock - begin_clock),

CALC_NS_AVG_CLOCK(end_clock - begin_clock, max_task_number));

return 0;

}

#else

int main() {

puts("cotask disabled");

return 0;

}

#endif

相关文章:

C++ 协程

经典协程辅助入门代码&#xff1a; typedef cotask::task my_task_t; int main() { // create a task using factory function [with lambda expression] my_task_t::ptr_t task my_task_t::create([]() { //创建协程 std::cout ()->get_id() cotask::this_task::get…...

Flutter学习(六)EventBus的使用

背景 项目开发过程中&#xff0c;有些场景&#xff0c;需要跨页面进行数据传递。按照安卓开发的思路&#xff0c;在flutter实现一个事件总线EventBus&#xff0c;进行数据传递 原理 通过dart的签名函数&#xff0c;进行监听集合设置&#xff0c;然后post分发的时候&#xff…...

Linux系统---僵尸进程、孤儿进程

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 键盘敲烂&#xff0c;年薪百万&#xff01; 有了上一篇博客的学习&#xff0c;我们已经简单了解了进程的基础知识&#xff0c;今天我们再来学习两个特殊的进程&#xff0c;僵尸进程和孤儿进程。 …...

SpringBoot中如何优雅地使用重试

1 缘起 项目中使用了第三方的服务&#xff0c; 第三方服务偶尔会出现不稳定、连接不上的情况&#xff0c; 于是&#xff0c;在调用时为了保证服务的相对高可用&#xff0c;添加了超时连接重试&#xff0c; 当连接第三方服务超时时&#xff0c;多重试几次&#xff0c;比如3次&a…...

数据库日志解析:深入了解MySQL中的各类日志

**> &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 数据库日志解析&#xff1a;深入了解MySQL中的各类日志 前言第一&#xff1a;错误日志❌1. 错误日志的作用2. 记录内容3. 故障排查的方法 第二&#xff1a;查询日志1.…...

操作系统题目分类总结 | 进程管理 内存管理 文件系统 设备管理

系列文章如下 学习过程中一定要有系统观念&#xff08;知识框架&#xff0c;每一章开头都会有一个思维导图&#xff09;&#xff0c;知道目前自己在学习的是哪一板块的内容&#xff0c;和前面有什么样的联系 操作系统的很多知识点前后都是联系非常紧密的&#xff0c;去一点一…...

数据结构——单链表(Singly Linked List)

1.链表介绍 链表是一种物理储存上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。 对于上图&#xff0c;每一个结点都是一个结…...

4面试题--数据库(补充)

隔离性问题 若不考虑隔离性则会出现以下问题 1. 脏读&#xff1a;指⼀个事务在处理数据的过程中&#xff0c;读取到另⼀个 未提交 事务的数据 2. 不可重复读&#xff1a;指对于数据库中的某个数据&#xff08;同⼀个数据项&#xff09;&#xff0c;⼀个事务内的多次查询却…...

人力资源管理后台 === 左树右表

1.角色管理-编辑角色-进入行内编辑 获取数据之后针对每个数据定义标识-使用$set-代码位置(src/views/role/index.vue) // 针对每一行数据添加一个编辑标记this.list.forEach(item > {// item.isEdit false // 添加一个属性 初始值为false// 数据响应式的问题 数据变化 视图…...

WordPress无需插件禁用WP生成1536×1536和2048×2048尺寸图片

我们在使用WordPress上传图片媒体文件的时候&#xff0c;是不是看到媒体库中有15361536和20482048的图片文件&#xff0c;当然这么大的文件会占用我们的服务器空间&#xff0c;如何禁止掉呢&#xff1f; function remove_default_image_sizes( $sizes) {unset( $sizes[1536x15…...

Git 与 Maven:企业级版本管理与版本控制规范设计

一、背景 当今&#xff0c;许多开发人员熟悉 GitFlow 工作流程&#xff0c;但往往忽略了 GitFlow 如何与 Maven 版本控制结合&#xff0c;尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理&#xff0c;提出一个统一的企业…...

Springmvc原理解析

1. DispatcherServlet springmvc的核心控制器&#xff0c;负责截获所有的请求&#xff0c;当截获请求后委托给HandlerMapping进行请求映射的解析工作&#xff0c;目的是找到哪一个Controller的方法可以处理该请求&#xff0c;找到后再交由给HandlerAdaptor去负责调用并返回Mod…...

Retrofit怎么返回一个JSON字符串?

项目用已经使用了 Retrofit&#xff0c;定义了接口方法&#xff0c;返回了 JSON 转换后的实体对象&#xff0c;炒鸡方便。但是总有意料之外的时候&#xff0c;比如我不需要返回实体对象&#xff0c;我要返回纯纯的 JSON 字符串&#xff0c;怎么办呢&#xff1f; 先看源码 通过…...

【GCC】2:chatgpt:SendSideBandwidthEstimation

webrtc中SendSideBandwidthEstimation类的设计 The SendSideBandwidthEstimation class in WebRTC is a critical component in its video engine. It’s responsible for deciding the video traffic rate that can be sent without overloading the network and thus maintai…...

OpenGL 自学总结

前言&#xff1a; 本人是工作后才接触到的OpenGL&#xff0c;大学找工作的时候其实比较着急&#xff0c;就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思&#xff0c;很担心自己往后能力跟不上年龄的增长。因此想在工作之余…...

java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList

文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.…...

【2023.11.26】Mybatis自定义映射规则学习

创建自定义映射规则 <select id"selectArtist" resultMap"test">select * from artist </select> 在SQL语句标签中将resultType修改为resultMap&#xff0c;即自定义映射的id。 编写自定义映射规则&#xff1a; <resultMap id"tes…...

Nginx(九) aio sendfile directio 组合使用测试(2)

测试7&#xff1a;开启directio2m、sendfile&#xff0c;关闭aio&#xff0c;请求/vendor.js {"time_iso8601":"2023-11-26T22:47:3508:00","request_uri":"/vendor.js","status":"200","bytes_sent":…...

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能&#xff0c;就像大数据领域里有离线计算和实时计算&#xff0c; ETLCloud 还提供了基于 CDC &#xff08;Change Data Capture&#xff09;的实时数据集成功能&#xff1a;实时数据集成是指通过变化数据捕获技术&#…...

【云平台】STM32微信小程序阿里云平台学习板

【云平台】STM32微信小程序阿里云平台学习板 文章目录 前言一、立创EDA&#xff08;硬件设计&#xff09;1.主控STM32F103C8T62.ESP8266模块3.温湿度模块4.光照强度模块5.OLED显示模块6.PCB正面7.PCB反面8.3D视角正面9.3D视角反面 二、【云平台】STM32微信小程序阿里云平台学习…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...