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  id );
* 放弃协程:void  yield();
* 等待异步任务结果:TYPE  await(TYPE(*f)());
* 获取当前协程的ID:routine_t current();
* SPSC通道模板类:class Channel<T>:支持push()/pop()操作;

可以在 https://github.com/tonbit/coroutine 获取项目源码。

一个具体的例子如下,注释中解释了每个API的使用:

#include <iostream>
#include <chrono>
//只需下载include此文件
#include "coroutine.h"//SPSC通道,多个生产者或消费者,协程调度行为不好控制
coroutine::Channel<int> channel; string async_func()
{std::this_thread::sleep_for(std::chrono::milliseconds(3000));return "21";
}void routine_func1()
{//从通道中获取消息,如果没有消息会yieldint i = channel.pop();std::cout << i << std::endl;i = channel.pop();std::cout << i << std::endl;
}void routine_func2(int i)
{std::cout << "20" << std::endl;//放弃当前协程的执行,返回恢复点coroutine::yield();std::cout << "21" << std::endl;//异步执行任务,如果任务无法立即执行完毕,会yieldstring str = coroutine::await(async_func);std::cout << str << std::endl;
}void thread_func()
{//创建协称,回调函数形式为:std::function<void()>coroutine::routine_t rt1 = coroutine::create(routine_func1);coroutine::routine_t rt2 = coroutine::create(std::bind(routine_func2, 2));std::cout << "00" << std::endl;//恢复rt1coroutine::resume(rt1);std::cout << "01" << std::endl;//恢复rt2coroutine::resume(rt2);std::cout << "02" << std::endl;//向通道推送消息channel.push(10);std::cout << "03" << std::endl;coroutine::resume(rt2);std::cout << "04" << std::endl;channel.push(11);std::cout << "05" << std::endl;//销毁协程。//建议:协程在执行完毕后统一释放,这样协程栈空间中的对象能够安全的被到释放。coroutine::destroy(rt1);coroutine::destroy(rt2);
}int main()
{std::thread t1(thread_func);std::thread t2([](){//不支持跨线程的协程调度});t1.join();t2.join();return 0;
}

程序执行结果为:

00
01
20
02
10
03
21
04
11
05

转载自:https://my.oschina.net/attobit/blog/753962

C++协程库coroutine使用指南相关推荐

  1. 【并发编程二十】协程(coroutine)_协程库

    [并发编程二十]协程(coroutine) 一.线程的缺点 二.协程 三.优点 四.个人理解 五.协程库 1.window系统 2.unix系统(包括linux的各个版本) 2.1.makeconte ...

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

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

  3. ucontext-人人都可以实现的简单协程库

    1.干货写在前面 协程是一种用户态的轻量级线程.本篇主要研究协程的C/C++的实现. 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#.erlang.golang* 轻量级有pytho ...

  4. cmake导入so库_libgo - 协程库、并行编程库

    libgo是一个使用C++11编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库, 是专为Linux服务端程序开发设计的底层框架. 目前支持三个平台: Linux (GCC4.8 ...

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

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

  6. Python 的协程库 greenlet 和 gevent

    greenlet 官方文档:https://greenlet.readthedocs.io/en/latest/ From:https://www.jianshu.com/u/3ab212f28d91 ...

  7. c++开源协程库libgo介绍及使用

    协程这个概念,最近这几年可是相当地流行了.尤其 go 语言问世之后,内置的协程特性,完全屏蔽了操作系统线程的复杂细节.甚至使 go 开发者"只知有协程,不知有线程"了.当然 C++ ...

  8. C++ 开源协程库 libco——原理及应用

    1 导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情.在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此.即便使用 libevent, libev这 ...

  9. 微信 libco 协程库原理剖析

    作者:alexzmzheng 同 Go 语言一样,libco 也是提供了同步风格编程模式,同时还能保证系统的高并发能力,本文主要剖析 libco 中的协程原理. 简介 libco 是微信后台大规模使用 ...

最新文章

  1. linux虚拟磁盘管理pe大小6,Linux下磁盘的高级管理——LVM逻辑卷管理
  2. Java 调用存储过程 返回结果集
  3. linux多进程网络实例,Linux下一个单进程并发服务器的实例 使用select
  4. 树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】
  5. python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍
  6. 04-Fibonacci
  7. Python案例:破译爬虫项目实践活动日期密码
  8. Gstreamer调用pulseaudio播放流程(十三)
  9. 阿里云OSS文件上传
  10. [学习报告]《LeetCode零基础指南》第三讲循环-gyro
  11. STM32采用串口DMA方式,发送数据
  12. Mac安装mysql最简单
  13. gluster部署和使用
  14. 【日常踩坑】使用空字符串ciphertext[i]来赋值报错
  15. lowess和loess方法
  16. 网上很牛逼的IT技术网站
  17. ES搜索 should与must共用,should失效
  18. 运行时数据区-堆(Heap)
  19. 转:Webrtc video framerate/resolution 自适应
  20. 蹲175年的号子?维基解密阿桑奇动了谁的奶酪?

热门文章

  1. python filter函数_Python列表的8个实用技巧
  2. yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
  3. CNN(Convolutional Neural Networks)没有原理只有实现
  4. 如何高效的学习掌握新技术
  5. JQuery 总结(6) 锋利的jQuery
  6. 初学Java Web(9)——学生管理系统(简易版)总结
  7. 初学Java Web(8)——过滤器和监听器
  8. 面试必备:LinkedHashMap源码解析(JDK8)
  9. Java异常的栈轨迹(Stack Trace)
  10. Class对象和Java反射机制