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

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

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

相关文章

uniapp在H5端实现PDF和视频的上传、预览、下载

上传 上传页面 <u-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6" required><u-button click"upload" slot"right" type"primary" icon"arrow-upward" t…

流媒体播放器EasyPlayer播放H.265与H.264时进度条样式异常该如何解决?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员?

网易云音乐7天黑胶VIP会员免费领取入口怎么领取网易云音乐黑胶VIP7天会员&#xff1f; 1、百度搜索「词令」&#xff0c;在搜索框内输入词令「vip163」关键词直达口令&#xff0c;进入网易云音乐7天黑胶VIP会员免费领取入口&#xff1b; 2、输入网易云音乐黑胶VIP7天会员领取词…

AJAX技术-04-- 跨域说明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 同源策略同源策略介绍规定要求 请求协议://域名:端口号 关于同源策略练习关于同源策略总结 2.JSONPJSONP原理说明关于JSONP优化 3.CORS介绍介绍不允许跨域说明跨域…

Cascader 级联选择器动态加载数据的回显

如果后端没有只返回第三级的id,而是同时把第三级的名字一起返回了&#xff0c;那么就可以通过下面的方法来实现 1.在级联选择器里面加上这句代码 placeholder"请选择" 2.注册一个字符串 pleasett:"" 3.赋值 如过后端返回的有第三级的选项名 直接进行赋…

itBuilder支持AI对话方式设计表结构啦

更新提示 在老版的AI中不能对话&#xff0c;当AI对需求理解的不准确、不全面时&#xff0c;本次带来的更新针对这个缺陷&#xff0c;提供了再次和AI交互的功能&#xff0c;可以基于之前的设计结果进行修正&#xff0c;详情请点击视频查看。 vedio

【WP】Geek Challenge 2023 web 部分wp

官方出的题很好 学到很多东西 前面几道入门提就不写了 klf_ssti 目录扫描扫到一个robots.txt 打开存在hack路径&#xff0c;查看源码存在klf 传参,结合题目 就是ssti注入了&#xff0c;然后使用tplmap工具发现是盲注&#xff0c;我们这里直接用脚本找popen&#xff1a; im…

深度学习之十一(扩散模型--Diffusion Variational Autoencoder,DVAE)

概念 扩散模型DVAE(Diffusion Variational Autoencoder)是一种结合了变分自动编码器(VAE)和扩散过程的生成模型。它结合了时间连续的扩散过程和变分自编码器的概念,用于建模和生成具有时间序列结构的数据,例如视频、时间序列等。 主要概念: 变分自编码器(VAE): VAE…

一键修复0xc000007b错误代码,科普关于0xc000007b错误的原因

最近很多用户都有遇到过0xc000007b错误的问题&#xff0c;出现这样的问题想必大家都会手足无措吧&#xff0c;其实解决这样的问题也有很简单的解决方法&#xff0c;这篇文章就来教大家如何一键修复0xc000007b&#xff0c;同时给大家科普一下关于0xc000007b错误的原因&#xff0…

禁止编辑的PPT幻灯片,如何有效保护文件安全?

【幻灯片解密、去除密码、找回密码指南】 具体步骤如下&#xff1a;第一步百度搜索【密码帝官网】&#xff0c;第二步在用户中心上传需要解密的文件即可。 你是否有遇到过打开一个PPT文件却发现它被去除了密码无法编辑的情况&#xff1f;别担心&#xff0c;将为您提供最简单的解…

演员及作品-合并单元格

演员作品发行年份 赵丽颖 幸福到万家2022有翡2020知否知否应是绿肥红瘦2017花千骨2015刘亦菲花木兰2020第三种爱情2015四大名捕2012

Redis多机数据库

文章目录 Redis多机数据库一、主从复制1、旧版复制功能的实现a、同步b、命令传播 2、旧版复制功能的缺陷3、新版复制功能的实现a、部分同步功能b、复制实现步骤 4、心跳检测 二、哨兵1、Sentinel概念2、Sentinel初始化流程3、故障转移过程 三、集群1、几个概念2、集群创建流程a…

逆袭之战,线下门店如何在“?”萧条的情况下实现爆发增长?

未来几年&#xff0c;商业走势将受到全球经济形势、科技进步和消费者需求变化等多种因素的影响。随着经济复苏和消费者信心提高&#xff0c;消费市场将继续保持增长&#xff0c;品质化、个性化、智能化等将成为消费趋势。同时&#xff0c;线上购物将继续保持快速增长&#xff0…

Spring Data Redis切换底层Jedis 和 Lettuce实现

1 简介 Spring Data Redis是 Spring Data 系列的一部分&#xff0c;它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象&#xff0c;还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis&#xff0c;并且可以切换Jedis和Lett…

springboot+vue实现websocket通信实例,进入页面建立连接

springbootvue实现websocket通信实例 进入页面建立连接 前端代码&#xff1a; <template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show&qu…

HarmonyOS应用开发者高级认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09;在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xf…

NFTScan | 11.20~11.26 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.20~ 2023.11.26 NFT Hot News 01/ OKX Ordinals 市场 API 完成升级 11 月 21 日&#xff0c;OKX Ordinals 市场 API 现已完成升级&#xff0c;新增支持按币种单价查询、排序&…

【Python游戏开发】使用Python编写拼图益智游戏教程

使用Python编写拼图益智游戏 大家一般都玩过拼图益智游戏&#xff0c;或者类似的游戏。今天&#xff0c;就给大家使用pygame库在Python中构建一个拼图益智小游戏。这个拼图小游戏是构建一个围绕着将1-15个数字排列在16个方块的网格中的游戏。 现在&#xff0c;让我们从今天的惊…

反思一次效能提升

前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。 改进前 在同一个产品团队&#xff0c;同时有前端工程师和后端工程师。他们经常需要共同协作完成features。 前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。 打包后&#xff0c…

十四、机器学习进阶知识:KNN分类算法

文章目录 1、KNN分类介绍2、KNN分类核心要素3、KNN分类实例1.1 鸢尾花分类1.2 手写数字识别 1、KNN分类介绍 分类是数据分析中非常重要的方法&#xff0c;是对己有数据进行学习,得到一个分类两数或构造出一个分类模型&#xff08;即通常所说的分类器(Classifier))。分类是使用…