现在位置: 首页 > 协程
      最近研究高性能C++协程,网上了解到了魅族libgo、腾讯libco、开源libaco、boost coroutine,这里记录一下。 1 什么是协程        协程可以很轻量的在子例程中进行切换,它由程序员进行子例程的调度(即切换)而不像线程那样需要内核参与,同时也省去了内核线程切换的开销,因为一个协程切换保留的就是函数调用栈和当前指令的寄存器,而线程切换需要陷入内核态,...
阅读全文
2017-08-08 17:59 工业·编程 ⁄ 共 1558字 暂无评论
1、协程是什么? (1)线程 每一个线程都代表一个执行序列。当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行。在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定。 (2)协程 协程跟线程都代表一个执行序列。不同的是,协程把线程中不确定的地方尽可能的去掉...
阅读全文
2017-07-25 15:40 工业·编程 ⁄ 共 4734字 暂无评论
    libco 协程库在单个线程中实现了多个协程的创建和切换。按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行。而libco 中的协程却实现了函数执行到一半时,切出此协程,之后可以回到函数切出的位置继续执行,即函数的执行可以被“拦腰斩断”,这种在函数任意位置 “切出——恢复” 的功能是如何实现的呢?     本文从...
阅读全文
微信诞生于2011年1月,当年用户规模为0.1亿左右;2013年11月,微信月活跃用户数达到3.55亿,一跃成为亚洲地区拥有最大用户群体的移动终端即时通讯软件。 面对如此体量的提升,微信后台也曾遭遇棘手的窘境;令人赞叹的是技术人及时地做出了漂亮的应对。 这背后有着怎样的技术故事? 此时此刻,你在微信手机端发出的请求,是怎样被后台消化和处理的?这次,我们聚焦微信后台解决方案之协程库libco。该项目在保留后台敏捷的同步风...
阅读全文
2017-05-17 08:16 工业·编程 ⁄ 共 2404字 暂无评论
    对于后台开发,一个重要问题即使用尽可能少的服务器资源处理海量的请求,除了我们再架构上做多机自动扩容外,我们还必须尽可能提高单机硬件的利用率(CPU利用率+IO利用率) 为了提高硬件的利用率往往我们采用三种技术路径: 多线程 异步IO 协程 协程和异步IO以及多线程的对比 多线程 多线程可以充分利用CPU的多核,实现真正的并行,它是操作系统的基础设施。但是线程是一个粗粒度、相对比较笨重的多任务的抽...
阅读全文
2017-05-10 07:26 工业·编程 ⁄ 共 1957字 暂无评论
之前一直没想明白了一个问题, 就是关于协程如何进行上下文切换。众所周知, 协程是分为有栈协程和无栈协程俩种. 区别在于是否有自己的调用栈来进行函数调用等操作. 有栈协程 有栈协程这里的做法比较好理解, 一般来说有俩种做法: 采用操作系统提供的api 类似 ucontext 或者 setjump longjump 用汇编操控寄存器保存状态 典型的例子 static void context_swap(struct Context* prev_, struct Context* next_) { // store in .da...
阅读全文
2017-05-03 06:45 工业·编程 ⁄ 共 1665字 暂无评论
https://github.com/tonbit/coroutine是一个精巧的C++非对称协程库。库只有一个.h文件(<500行的代码),使用时也仅需要include这个头文件。但是在功能上,可以提供Linux/Macos/Windows平台的几个必备的协程API(命名空间coroutine): * 创建协程:routine_t  create( std::function<void()>  f ); * 销毁协程:void  destroy( routine_t  id ); * 恢复协程:int  resume( routine_t  ...
阅读全文
2017-04-26 18:17 工业·编程 ⁄ 共 1663字 暂无评论
    对于IO密集型的程序,一般比较高效的做法是选择异步来实现,因为使用异步的方法更容易写出高效的程序。然而使用异步的话,经验较少的人往往会使自己的程序结构变得很混乱,进而导致程序的可读性变差。记得有人说过,在硬件飞速发展的现在,程序的可读性和可维护性的重要性在不断提高,甚至有一种更激进的说法,程序的可读性是第一位的。     从Boost的1.54版本开始,coroutine引入了一种新型...
阅读全文
2017-03-21 13:59 工业·编程 ⁄ 共 2693字 评论 1 条
    协程是在线程之上由“用户”构建的并发单元,对OS来说无感知,协程的切换由用户自己管理和调度。(这里的用户是相较于内核而言的,一些通用库这里也理解为用户) C/C++怎么实现协程     作为一个C++后台开发,我知道像go, lua之类的语言在语言层面上提供了协程的api,但是我比较关心C++下要怎么实现这一点,下面的讨论都是从C/C++程序员的角度来看协程的问题的。 boost和腾讯都推出了相关的库...
阅读全文