libco协程学习

协程实现 - 生产者消费者 初识协程 1. 一个简单生产者消费者的例子 在多线程中一个耳熟能详经典的例子:生产者消费者。那么它在协程中的应用场景如何呢?让我们就从这个简单的例子入手,来看一看使用libco实现的生产者与消费者。 libco协程实现的生产者消费者: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #incl... 阅读详情

先贴一下libco的生产者消费例子(来源于腾讯开源项目libco)

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include "co_routine.h"
using namespace std;
struct stTask_t
{
int id;
};
struct stEnv_t
{
stCoCond_t* cond;
queue<stTask_t*> task_queue;
};
void* Producer(void* args)
{
co_enable_hook_sys();
stEnv_t* env=  (stEnv_t*)args;
int id = 0;
while (true)
{
stTask_t* task = (stTask_t*)calloc(1, sizeof(stTask_t));
task->id = id++;
env->task_queue.push(task);
printf("%s:%d produce task %d\n", __func__, __LINE__, task->id);
co_cond_signal(env->cond);  //通知消费者继续工作
poll(NULL, 0, 1000);//挂起
}
return NULL;
}
void* Consumer(void* args)
{
co_enable_hook_sys();
stEnv_t* env = (stEnv_t*)args;
while (true)
{
if (env->task_queue.empty())
{
co_cond_timedwait(env->cond, -1); //放弃cpu,转让给生产者协程
continue;
}
stTask_t* task = env->task_queue.front();
env->task_queue.pop();
printf("%s:%d consume task %d\n", __func__, __LINE__, task->id);
free(task);
}
return NULL;
}
int main()
{
stEnv_t* env = new stEnv_t;
env->cond = co_cond_alloc();


stCoRoutine_t* consumer_routine;
co_create(&consumer_routine, NULL, Consumer, env); //创建消费者
co_resume(consumer_routine);//提交消费协程


stCoRoutine_t* producer_routine;
co_create(&producer_routine, NULL, Producer, env); //创建生产者
co_resume(producer_routine);//提交生产者协程

co_eventloop(co_get_epoll_ct(), NULL, NULL);协程事件循环
return 0;
}

libco是一个非对称协程,具有父子关系;

协程就是在一个线程中来回切换工作。


C++开源协程库libco-原理与应用 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有 应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序结构依然不会很简单。为何会这样?因 为这类框架提供的都是非阻塞式的、异步的编程接口,异步的编程方式,这需要思维方 式的转变。为什么 golang 近几年能够大规模流行起来呢?因为简单。这方面最突出的 一点便是它的网络编程 API,完全同步阻塞式的接口。要并发?go 出一个协程就好了。 相信对于很多人来说,最开始接触这种编程方式,是有点困惑的。程序中到处都是同步 阻塞式的调用,这程序性能能好吗?答案是,好,而且非常好。那么 golang 是如何做 到的呢?秘诀就在它这个协程机制里 立即下载

相关推荐

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

libco源码阅读(八):hook机制

1. hook机制是什么 2. 动态连接和静态连接 2.1 编译过程 2.2静态链接 2.3 动态链接 3. hook机制的实现 3.1 使用环境变量LD_PRELOAD 3.2 源码入侵 跟着某位大佬的博客一步步看完了libco源码,本以为看到co_eventloop算是把源码看完了,但是没想到接着往下看,竟然还有一个hook机制,编程这么多年,还从未这么使用过,hook着实是编程里面的一个奇淫技巧。总之,多看优秀源码,对提高自己的编程水平...

蓬莱道人的博客 1080

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 334

【腾讯Bugly干货分享】揭秘:微信是如何用libco支撑8亿用户的

本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58203cfcd149ba305c5ccf85 作者:Leiffy 导语ibco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上。libco在2013年的时候作为腾讯六大开源项目首次开源,我们最近做了一次较大的更新,同步更新在https:/

腾讯Bugly的专栏 2190

【TCGA-CRC】TCGA数据读取

本文介绍了如何从TCGA数据库中处理结肠癌(COAD)和直肠癌(READ)的RNA测序数据。首先,通过data.table::fread函数读取基因表达量文件,并检查基因ID和基因名称的一致性。接着,批量读取所有样本的TPM(Transcripts Per Million)数据,并将其合并为表达矩阵。随后,通过匹配样本ID和文件名,确保表达矩阵的列名与样本ID一致。最后,筛选出编码蛋白质的基因,并将处理后的数据保存为Rdata文件。整个过程涉及数据读取、合并、匹配和筛选,为后续的基因表达分析提供了基础。

小八四爱吃甜食的博客 662

伪距单点定位推导+DOP值分析(附matlab仿真代码)

伪距单点定位公式推导、DOP值分析与matlab仿真分析

shannanshouyin的博客 2511

libco——源码分析(一)

总体的网络服务器操作流程是这样的:fill:#333;co_pollother增加epoll_fd监听文件描述符将自己的协程增加到计时队列中发送网络消息或者其他被激活的文件描述符放到激活队列loop取出超时队列中超时的任务放到超时队列将超时队列黏贴到激活队列末尾激活元素的回调函数处理resume挂起的协程loop写入收到消息的数据并返回上层loopco_pollother。

Dr_Jack的博客 1308

C# 上位机高级功能实战:报警、历史回放与远程监控

本文介绍了工业上位机系统的高级功能实现,主要包括实时报警机制、历史数据回放和远程监控三部分。报警功能通过阈值检测实现异常提醒;历史回放利用数据库存储数据,通过定时器控制回放进度;远程监控提供TCP、WebSocket等多种数据传输方式。文章还给出了综合优化建议,如异步处理、报警去抖动等,最终形成一个包含数据采集、显示、存储、报表及高级功能的完整工业自动化闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 749

协程库libco学习使用入门示例

简介 libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上。 libco通过仅有的几个函数接口 co_create/co_resume/co_yield 再配合 co_poll,可以支持同步或者异步的写法,如线程库一样轻松。同时库里面提供了socket族函数的hook,使得后台逻辑服务几乎不用修改逻辑代码就可以完成异步化改造。 libco是一个源码简洁而...

Arbboter的专栏 7826

聊聊蓝牙配对技术-CTKD OVER BR/EDR

摘要:本文探讨了蓝牙设备通过跨传输密钥派生(CTKD)机制实现双模连接的技术细节。研究发现,手机在连接双模耳机时优先通过BR/EDR配对,再利用CTKD派生BLE连接所需的密钥。关键条件包括:设备地址一致性、启用安全连接(Secure Connection)及禁用justworks配对方式。文章详细剖析了从BR/EDR链路密钥派生BLE长期密钥(LTK)的算法流程,重点解析了H6/H7加密函数的作用机制与安全差异。研究还通过HCI日志验证了密钥交换和加密建立的完整过程,指出蓝牙5.1版本对CTKD安全性的强

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2691

《YOLO26/YOLO11/YOLOv8改进与系统实战》,改进与系统实战专栏目录和介绍

YOLOv8 是目前比较火和比较成熟的深度学习框架,是2023年1月发布的,由 Ultralytics 团队开发。Ultralytics自YOLOv5 开始一直积极维护和更新 YOLO 框架,因此 YOLOv8 也享有持续的维护与升级支持。因此我写下《手把手教你YOLOv8实战》专栏,专门为那些对计算机视觉、深度学习、以及目标检测技术感兴趣的读者设计。通过本专栏,你将深入理解 YOLOv8 的核心原理与实际应用,从0 开始学习并掌握如何使用 YOLOv8 完成各类目标检测任务,帮助你快速上手并掌握 YOLO

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

[libco] 协程库学习,测试连接 mysql

历史原因,一直使用 libev 作为服务底层;异步框架虽然性能比较高,但新人使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率。 用同步方式实现异步功能,既保证了异步性能优势,又使得同步方式实现源码思路清晰,容易维护,这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库:libco 。 文章来源: [libco] 协程库学习,测试连接 mysql 1. 概述 libco 是轻量级的协程库,看完下面几个帖子,应该能大致搞懂它的工作原理。 微信开源C++协程库Libco—原

wenfh2020的专栏 727

【GameFramework框架内置模块】2、数据节点(Data Node)

这一篇讲数据节点DataNode,基本开发程序都会有类似数据节点作用的东西,数据节点的作用其实就是保存游戏运行时的一些缓存数据,比如用户登录信息、用户名、任务节点等等。数据一般会有增删改查这四种操作,在运行时的数据一般是使用单例或者静态属性,将数据存储在内存中而数据节点也是将数据存储在内存中,但是不用序列化数据,比使用单例或者静态属性要容易维护的多,特别时它的树形结构可以让我们很好的组织我们的数据结构,方便做增删改查操作。数据节点DataNode模块的数据的存储方式是以树形结构存储。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3178

C++协程学习笔记 +libco源码剖析

c++协程源码剖析

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 1090

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

异步编程?协程 和 异步?(学习总结 + libco协程库 部分 源码分析)

协程 和 异步?异步编程?

qq_53398102的博客 456

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

isql 测试mysql连接_[libco] 协程库学习,测试连接 mysql

历史原因,一直使用 libev 作为服务底层;异步框架虽然性能比较高,但新人学习和使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率。用同步方式实现异步功能,既保证了异步性能优势,又使得同步方式实现源码思路清晰,容易维护,这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库:libco 。1. 概述libco 是轻量级的协程库,看完下面几个帖子,应该能大致搞懂它的工作...

weixin_26705191的博客 578

二级目录 —— libco源码分析、学习笔记(腾讯协程开源库)

博客一级目录 libco源码分析/学习笔记 由于时间紧迫和我技术有限,一些前驱知识点我就不过多解释了。大概有基础的操作系统概念,一点汇编知识(64位汇编栈帧之类的东西),c/c++,linux网络编程。不用很精通(好吧博主我也比较菜),学习嘛。 对于linux而言,进程拥有系统资源(包括内存、cpu、显示器等)、是系统资源分配的基本单位;但是进程的分配和销毁代价比较大,为了提...

GreyBtfly的博客 1748

腾讯Libco协程开源库 源码分析(一)---- 下载Libco 编译安装 尝试运行示例代码

文章目录 前引 腾讯Libco协程开源库 源码分析(一)---- 下载Libco 编译安装 尝试运行示例代码 1、获得Libco源代码 2、编译Libco 得到示例文件 1、cmake编译 2、makefile 编译 3、尝试运行示例文件 浅看一下示例代码 1、example_echosvr.cpp 2、尝试运行example_echosvr 结束语......

Love 6's Private Blog 2169

libco源码解析(0) 概述与总结

引言 libco是一个微信后台大规模使用的c/c++协程库,在2013年开源,据说2013至今仍运行在微信的后台中。 正文 对libco的学习过程实际上是对于去年十一月份的一个问题的解答的过程,记得当时在学长提起这个东西以后对于其充满疑惑,但又对其功能感动十分震惊,在完成了对libco的学习以后算是解决了一个困扰我半年多的问题,也算是可喜可贺啦。 对于后来学习libco的朋友我的建议是先去温习一下操作系统中链接方面的知识,然后再去看看汇编语言程序设计,这两者都OK以后可以撸起袖子干活了,不要像我学到一般屁颠

李兆龙的博客 1678

co_routine(第三部分:协程各种操作)—— libco源码分析、学习笔记

博客一级目录 二级目录——libco源码分析/学习笔记 由于本源代码蛮长的,所以按照功能划分模块来分析,分为若干部分,详见二级目录↑ 代码文件:co_routine.h,co_routine.cpp,co_routine_inner.h 三、协程各种操作 void co_yield_env( stCoRoutineEnv_t *env );//将当前执行协程从协程栈中出栈并将执行权交给栈...

GreyBtfly的博客 1282

co_routine(第二部分 : 协程的创建)—— libco源码分析、学习笔记

  博客一级目录 二级目录——libco源码分析/学习笔记 参考大牛GitHub注释 由于本源代码蛮长的,所以按照功能划分模块来分析,分为若干部分,详见二级目录↑ 代码文件:co_routine.h,co_routine.cpp,co_routine_inner.h 参考博客 二、协程(task)的创建 每当启动(resume)一个协程时,就将它的协程控制块stCoRoutine_...

GreyBtfly的博客 869

C++学习记录:一个协程库的源码分析

抽空学习一些感兴趣的源码,这次学习云风大佬的一个协程库源码。 项目地址:https://github.com/cloudwu/coroutine 个人fork注释后的项目地址:https://github.com/zgg2001/coroutine 目录一、前言二、实现分析1. 数据结构2. 整体思路3. 唤醒 resume4. 挂起 yield三、小结 一、前言   本来是想学习一下鹅厂的 libco 协程库来着,无奈之前没怎么接触过协程的实现,且 libco 源码太厚实了,啃起来太慢,所以打算先学习.

这里是河边 1456

编程语言 - 汇编语言Assembly Language - 学习/实践

主要用于学习汇编语言的使用,以及在合适的项目中使用。

"代码"的日常搬运 543

co_routine.cpp分析

co_routine.cpp #include "co_routine.h" #include "co_routine_inner.h" #include "co_epoll.h" #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #inclu...

practer的博客 480

libco简要分析(待更)

文章目录源码分析co_routine.h 本篇分析分为两个部分。libco源码分析。libco例子分析。首先进行源码的分析。 分析之前需要了解一下前置知识 1.什么是协程? 2.什么是共享栈? 源码分析思路:对每个.h.cpp进行分析,先分析.h再分析对应的.cpp。 建议阅读顺序:结构体->与结构体关系紧密的函数->其他函数 建议例子和源码分析一起阅读,阅读体验更佳。另外参考了大量其...

practer的博客 333
上一篇: C++ 委托 fastdelegate
下一篇: valgrind内存检测工具
小小木易
博客等级 码龄11年 0粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值