C++协程库:orchid

分享到:

orchid是一个构建于强大的boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型。

协程,顾名思义,协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行。 协程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位。

协程可以被认为是一种用户空间线程,与传统的抢占式线程相比,有2个主要的优点:

  • 与线程不同,协程是自己主动让出CPU,并交付他期望的下一个协程运行,而不是在任何时候都有可能被系统调度打断。因此协程的使用更加清晰易懂,并且多数情况下不需要锁机制。
  • 与线程相比,协程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常的小。

green化

术语“green化”来自于python下著名的协程库greenlet,指改造IO对象以能和协程配合。某种意义上,协程与线程的关系类似与线程与进程的关系,多个协程会在同一个线程的上下文之中运行。因此,当出现IO操作的时候,为了能够与协程相互配合,只阻塞当前协程而非整个线程,需要将io 对象“green化”。目前orchid提供的green化的io对象包括:

  • tcp socket(还不支持udp)
  • descriptor(目前仅支持非文件类型文件描述符,如管道和标准输入/输出,文件类型的支持会在以后版本添加)
  • timer (定时器)
  • signal (信号)

chan:协程间通信

chan这个概念引用自golang的chan。每个协程是一个独立的执行单元,为了能够方便协程之间的通信/同步,orchid提供了chan这种机制。chan本质上是一个阻塞消息队列,后面我们将看到,chan不仅可以用于同一个调度器上的协程之间的通信,而且可以用于不同调度器上的协程之间的通信。

多核

建议使用的scheduler per cpu的的模型来支持多核的机器,即为每个CPU核心分配一个调度器,有多少核心就创建多少个调度器。不同调度器的协程之间也可以通过chan来通信。协程应该被创建在哪个调度器里由用户自己决定。

https://github.com/ioriiod0/orchid

昵    称:
验证码:

相关文档:

  • Qt 编程环境 Cobras
    Cobras 是一个Qt的编程环境,本身就是用Qt开发的,提供一个集成的基于GDB的调试工具。具有快速和使用简单的特点,整个环境只需一个可...
  • C语言和抽象思维(二)
    上一次我们说到C语言结合抽象思维完成一个非所见即所得的编辑器, 并且我们已经定义了这个编辑器应有的行为, 基本上抽象也已经完...
  • C语言字符串处理库 cstring
    cstring 是一个小型、简单的C类库,用来操作C语言风格的字符串。...
  • C++加密/解密库:libsodium
    libsodium 是一个流行、易于使用的软件库。主要用于加密、解密、签名和生成密码哈希等等。这是一个可移植的、跨编译器支持、可安装...
  • Concurrency Control Flow 并发流程控制
    回调函数是指将函数(这里的函数是泛指某一块可执行代码的引用,如C++的仿函数或Java中的接口和对象)作为参数传递给另一个函数。...
  • C++之父谈关于C++的五个需要被重新认识的观点(中)
    概述:学习和使用过C++的人几乎都曾经听说过下面的五个关于C++的描述,并且对这些话笃信不已,那么现在的情况是怎么样的呢?本文的...
  • C语言协程库 cgreenlet
    和子例程一样,协程也是一种程序组件。相对子例程而言,协程更加一般和灵活,但在实践中使用没有子例程广泛。协程源自 Simula 和 Mod...
  • 实现专业品质创意的C++开源包:Cinder
    Cinder是一个专为创意而生的C++开源包。Cinder是一款C++开源资料库,是一个跨平台的,专为程序制图、音频、视频、网络、图像处理和计算...
  • cppcheck - 静态 C/C++ 代码分析
    cppcheck是静态的C/C++ 代码分析工具,用以检查内存泄漏,错配的内存分配和释放,缓冲区溢出,以及更多的问题。...
  • C++界面库:DuiEngine
    一个C++界面库. 1. 作者将金山的BKWin进行了深度改写,从而使之更易于使用和开发。相比传统的WTL而言,DUIEngine增加了许多窗口特效,...
  • C++元模板语言 Metacza
    Metacza 是一个语言,其编译器可用 C++ 元模板语言进行输出。使用更简洁的语法让元模板语言编程更加简单。Matacza 可以让你使用 boost::mpl...
  • 免费的C/C++的线程库
    免费的C/C++的线程库...
  • C++ 输入类型不匹配检测方法
    C++中检测输入类型不匹配的检测方法。 输入类型不匹配是指输入的数据类型与所期望的类型不匹配,如 int n; cin >> n; 但输入的数...
  • 免费的解压缩C++库和源码
    免费的解压缩C++库和源码...
  • C/C++的URL解析库:oneurl
    oneurl是一个C/C++语言开发的url解析以及标准化开源库,基于googleurl内核函数...
  • 谷歌URL解析和规范化C库:google-url
    google-url 是一个用来解析URL和对URL进行标准化的C语言库。...
  • 开发者都应该使用的10个C++11特性
    在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛。不过我相信这些新特性当中有一些,应该成为所有C++...
  • 编码格式转换库 libiconv
    iconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。...
  • C++远程对象访问框架 ROXS
    Remote Object Access (ROXS) 是一个 C++ 的远程对象访问框架,类似于 CORBA 和 Java 的RMI 。它根据C++的头文件来生成代码进行双向通讯(回调方式...
  • C/C++内存分布
    一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...