C++协程库coroutine使用指南
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使用指南相关推荐
- 【并发编程二十】协程(coroutine)_协程库
[并发编程二十]协程(coroutine) 一.线程的缺点 二.协程 三.优点 四.个人理解 五.协程库 1.window系统 2.unix系统(包括linux的各个版本) 2.1.makeconte ...
- 一个“蝇量级” C 语言协程库
协程(coroutine)顾名思义就是"协作的例程"(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻 ...
- ucontext-人人都可以实现的简单协程库
1.干货写在前面 协程是一种用户态的轻量级线程.本篇主要研究协程的C/C++的实现. 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#.erlang.golang* 轻量级有pytho ...
- cmake导入so库_libgo - 协程库、并行编程库
libgo是一个使用C++11编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库, 是专为Linux服务端程序开发设计的底层框架. 目前支持三个平台: Linux (GCC4.8 ...
- 协程库st(state threads library)原理解析
协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level thread). 这里有一个基本的协程例子 ...
- Python 的协程库 greenlet 和 gevent
greenlet 官方文档:https://greenlet.readthedocs.io/en/latest/ From:https://www.jianshu.com/u/3ab212f28d91 ...
- c++开源协程库libgo介绍及使用
协程这个概念,最近这几年可是相当地流行了.尤其 go 语言问世之后,内置的协程特性,完全屏蔽了操作系统线程的复杂细节.甚至使 go 开发者"只知有协程,不知有线程"了.当然 C++ ...
- C++ 开源协程库 libco——原理及应用
1 导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情.在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此.即便使用 libevent, libev这 ...
- 微信 libco 协程库原理剖析
作者:alexzmzheng 同 Go 语言一样,libco 也是提供了同步风格编程模式,同时还能保证系统的高并发能力,本文主要剖析 libco 中的协程原理. 简介 libco 是微信后台大规模使用 ...
最新文章
- linux虚拟磁盘管理pe大小6,Linux下磁盘的高级管理——LVM逻辑卷管理
- Java 调用存储过程 返回结果集
- linux多进程网络实例,Linux下一个单进程并发服务器的实例 使用select
- 树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】
- python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍
- 04-Fibonacci
- Python案例:破译爬虫项目实践活动日期密码
- Gstreamer调用pulseaudio播放流程(十三)
- 阿里云OSS文件上传
- [学习报告]《LeetCode零基础指南》第三讲循环-gyro
- STM32采用串口DMA方式,发送数据
- Mac安装mysql最简单
- gluster部署和使用
- 【日常踩坑】使用空字符串ciphertext[i]来赋值报错
- lowess和loess方法
- 网上很牛逼的IT技术网站
- ES搜索 should与must共用,should失效
- 运行时数据区-堆(Heap)
- 转:Webrtc video framerate/resolution 自适应
- 蹲175年的号子?维基解密阿桑奇动了谁的奶酪?
热门文章
- python filter函数_Python列表的8个实用技巧
- yspider爬取数据导入mysql_爬虫实战四、PyCharm+Scrapy爬取数据并存入MySQL
- CNN(Convolutional Neural Networks)没有原理只有实现
- 如何高效的学习掌握新技术
- JQuery 总结(6) 锋利的jQuery
- 初学Java Web(9)——学生管理系统(简易版)总结
- 初学Java Web(8)——过滤器和监听器
- 面试必备:LinkedHashMap源码解析(JDK8)
- Java异常的栈轨迹(Stack Trace)
- Class对象和Java反射机制