Boost中的协程—Boost.Asio中的coroutine类
Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类。
Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的。coroutine类非常简单,包括四个函数,一个int类型变量,用来保存当前函数的运行状态,与之配合使用的宏中,因采用switch来实现,所以可以根据这个整型变量的值实现跳转。
Boost.Asio定义了一些宏,构成所谓的“伪关键字”
reenter
reenter用来定义协程内容,用法如下:
reenter (coroutine变量)
{
... coroutine body ...
}
上面代码块如在成员函数内,coroutine变量用this,否则是变量名,最好别在body中定义变量,否则有麻烦(reenter的实现是用switch来做的)。
yield
yield的用法大致如下:
yield … 或 yield { … }
yield return
yield后加return,则reenter块后的代码不执行了。
yield;
本次进入reenter块什么都不做,但计数会增加
yield break
终止,再也不会进入reenter块
fork
fork用于“复制”协程,类似于unix的fork,程序先执行fork的代码,完毕后,再接着运行fork下一行代码。
boost::asio::coroutine c;
boost::asio::coroutine c2;
void forkit(int i)
{reenter(c2) {yield std::cout<<"forkit1 "<< i<<std::endl; yield std::cout<<"forkit2 "<< i<<std::endl; }
}void foo(int i)
{reenter(c) {yield {std::cout<<"foo1 "<<i<<std::endl;return;}fork foo(10);yield std::cout<<"foo2 "<< i<<std::endl;fork forkit(100); yield std::cout<<"foo3 "<< i<<std::endl;yield break;yield std::cout<<"foo4 "<< i<<std::endl; }printf("=====\n");
}
int main()
{forkit(1);foo(1);foo(2);foo(3); foo(4); foo(5); return 0;
}输出:
forkit1 1
foo1 1
foo2 10
=====
foo2 2
=====
forkit2 100
foo3 3
=====
=====
=====
程序运行示意图
通讯过程中stackless协程的用法示例(Boost.asio文档中示例)
struct session : boost::asio::coroutine
{boost::shared_ptr<tcp::socket> socket_;boost::shared_ptr<std::vector<char> > buffer_;session(boost::shared_ptr<tcp::socket> socket): socket_(socket), buffer_(new std::vector<char>(1024)){}void operator()(boost::system::error_code ec = boost::system::error_code(), std::size_t n = 0){if (!ec) reenter (this){for (;;){yield socket_->async_read_some(boost::asio::buffer(*buffer_), *this);yield boost::asio::async_write(*socket_, boost::asio::buffer(*buffer_, n), *this);}}}
};
需要说明的是,reenter中采用for循环后,运行顺序就变成了第一个yield,第二个yield,第一个yield…
Boost中的协程—Boost.Asio中的coroutine类相关推荐
- 串行和并行的区别_入门参考:从Go中的协程理解串行和并行
本文转自公众号语言随笔,欢迎关注 入门参考:从Go中的协程理解串行和并行mp.weixin.qq.com Go语言的设计亮点之一就是原生实现了协程,并优化了协程的使用方式.使得用Go来处理高并发问题 ...
- 在代码中实用协程(二)
第一篇的链接:在代码中实用协程(一) 在网络处理程序中,一个协程正在接收网络请求者,一个协程正在循环发包,另一个协程中正发生错误,删除链接. 问题:是否可以循环链表同时进行删除和添加操作 先看一段流程 ...
- Boost:以协程的方式实现重构echo服务器的实例
Boost:以协程的方式实现重构echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现重构echo服务器的实例 C++实现代码 #include < ...
- Boost:以协程的方式实现带有默认值的echo服务器的实例
Boost:以协程的方式实现带有默认值的echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现带有默认值的echo服务器的实例 C++实现代码 #inc ...
- Boost:以协程的方式实现带有单个默认值的echo服务器的实例
Boost:以协程的方式实现带有单个默认值的echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现带有单个默认值的echo服务器的实例 C++实现代码 ...
- Boost:以协程的方式实现echo服务器的实例
Boost:以协程的方式实现echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现echo服务器的实例 C++实现代码 #include <boo ...
- Boost:以协程的方式实现聊天服务器的实例
Boost:以协程的方式实现聊天服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现聊天服务器的实例 C++实现代码 #include <cstdlib ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- 二十五、深入Python中的协程
@Author: Runsen 一说并发,你肯定想到了多线程+进程模型,确实,多线程+进程,正是解决并发问题的经典模型之一.但对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能. ...
最新文章
- Java必会的面试题
- 不编程,拖拖鼠标图表自己动起来!来自图形学大牛陈宝权弟子,已获ACM CHI最佳论文荣誉提名...
- RHEL 7安装教程
- VTK:小部件之ImageTracerWidgetNonPlanar
- Ubuntu14.04下搭建LAMP环境
- 用计算机实现智能解题,浙江省信息技术学考复习模块2——计算机功能、智能处理、字处理...
- 【jzoj】2018.2.1 NOIP普及组——D组模拟赛
- ruby中正则表达式最小匹配与最大匹配
- 阿里合伙人程立:阿里15年,我撕掉了身上两个标签
- oracle clusterware 11g,Oracle11gR2clusterware启动顺序
- centos7和centos6 开机 运行级别详解和设置
- RTSP之主流安防厂家地址
- Python笔试面试题
- 成语接龙、歇后语 js JavaScript html web nodejs成语接龙离线js库
- netmeeting的使用(详解)
- linux下搭建redis内网端口映射工具-rinetd
- 推荐使用Ubutun16.04亮度调节工具
- 无条件呼叫前转接已启用
- CAN总线的学习总结
- Delphi 热键 使用WIN作为热键的组合键 给程序增加快捷键