https://www.cnblogs.com/dearplain/p/9820913.html

这里说的是Tencent开源的libco。

libco的用途和依赖

主要还是c/c++服务端,相比libevent,libco支持的平台有限。但是libco显得更先进,可以写“阻塞式代码”,改造旧库的时候甚至不需要改代码。

libco是独立的库,没有侵入性,能插入到几乎所有代码中使用。但是,libco需要运行一个永久阻塞的函数,这意味着,libco是独占的,一个系统线程内,不能有其他调度和阻塞函数,比如阻塞的网络函数,其他coroutine的类似实现,无限循环等。

学习libco的方法

看例子是最快最直观的,官方库上就有很多example。

libco的调度,相比goroutine的不同

libco需要通过co_yield_ct()等yield函数主动进行切换,切换出去的微线程,需要其他微线程co_resume才能运行,否则是不会被调度的。这个和goroutine不一样。

libco的网络函数,会主动调用yield函数进行切换,然后由运行event_loop的微线程恢复,因此需要显式地调用co_eventloop这个函数。

libco的栈大小

libco的栈可以是独立的,也可以是共享的。

独立的预先申请栈大小使用,注意栈的大小,通常比较小。

共享的先申请一个大栈,然后libco切换的时候根据栈使用的大小拷贝到另一个内存。因此最大值还是受到共享栈大小的影响。

libco的信息保存在哪里

libco的微线程信息,保持一个context上,这个context根据线程pid保存在一个全局大数组上。所以每一个线程独立调度下面的所有微线程。

所以每一个系统线程,有网络收发的都需要调用co_eventloop。

libco如何获得实际的栈大小

获得栈顶之后减去栈基。
//get curr stack sp
char c;
curr->stack_sp= &c;

int len = stack_mem->stack_bp - occupy_co->stack_sp;

c协程库libco几点体会的更多相关文章

  1. libco协程库上下文切换原理详解

    缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行.而li ...

  2. 协程 及 libco 介绍

    libco 是腾讯开源的一个协程库,主要应用于微信后台RPC框架,下面我们从为什么使用协程.如何实现协程.libco使用等方面了解协程和libco. why协程 为什么使用协程,我们先从server框 ...

  3. C高级 跨平台协程库

    1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别 ...

  4. Stackful 协程库 libgo(单机100万协程)

    libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库. 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第 ...

  5. 基于ASIO的协程库orchid简介

    什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思 ...

  6. 写个百万级别full-stack小型协程库——原理介绍

    其实说什么百万千万级别都是虚的,下面给出实现原理和测试结果,原理很简单,我就不上图了: 原理:为了简单明了,只支持单线程,每个协程共享一个4K的空间(你可以用堆,用匿名内存映射或者直接开个数组也都是可 ...

  7. 一个“蝇量级” C 语言协程库

    协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...

  8. 协程库st(state threads library)原理解析

    协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level thread). 这里有一个基本的协程例子 ...

  9. libaco: 一个极速的轻量级 C 非对称协程库 🚀 (10 ns/ctxsw + 一千万协程并发仅耗内存 2.8GB + Github Trending)

    0 Name 简介 libaco - 一个极速的.轻量级.C语言非对称协程库. 这个项目的代号是Arkenstone 

随机推荐

  1. 该死的端口占用!教你用 Shell 脚本一键干掉它!

    1. 前言 大家好,我是安果! 在 Web 开发中,经常会遇到「端口被占用」的场景 常规解决方案是: 使用 lsof -i 命令查询占用端口的进程 PID 利用 kill -9 PID 干掉目标进程 ...

  2. cpu缓存和volatile

    目录 CPU缓存的由来 CPU缓存的概念 CPU缓存的意义 缓存一致性协议-MESI协议 Store Buffers Store Forwarding Memory Barriers Invalida ...

  3. ubuntu18.04+gunicorn+nginx+supervisor+mysql+redis安装django项目

    Ubuntu18.04 install Django project 项目准备: ECS 实例 (云服务器) 此安装部署方案适合本地ubuntu18.04系统安装和虚拟机中ubuntu18.04系统安 ...

  4. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  5. C# 应用 - 多线程 3) Task.Factory

    1. 与 Task.Run() 的区别: 先看一下源码: public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable { pu ...

  6. slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题

     slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题 上次解决区域选择不能跨冻结列问题的时候,剩了个尾巴,从右往左选择的时候,会出现选择不正常的情况,后 ...

  7. Pytorch编程记录

    搭建网络的方式: 1.用sequential方式搭建,只能适用于线性网络 2.用forward和init方式搭建

  8. 如何对shell脚本中斜杠进行转义?

    1.在编写shell脚本时,经常会遇到对某个路径进行替换,而路径中包含斜杠(/),此时我们就需要对路径中涉及的斜杠进行转义,否则执行失败.具体示例如下: 需求描述: 将sjk目录下的test文件中的p ...

  9. c# DataGirdView动态刷新

    using MySql.Data.MySqlClient;using System; using System.Data; using System.Threading; using System.W ...

  10. 一种3位sar adc工作过程推导(二)

    3位sar adc采用下图的电容阵列,需要23个电容,它的基本单元有二进制加权的电容阵列.1个与LSB电容等值的电容:它利用电容上的初始电荷再分配完成二进制搜索算法,因此功耗一般比较小,而且不需要额外 ...