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类相关推荐

  1. 串行和并行的区别_入门参考:从Go中的协程理解串行和并行

    本文转自公众号语言随笔,欢迎关注 入门参考:从Go中的协程理解串行和并行​mp.weixin.qq.com Go语言的设计亮点之一就是原生实现了协程,并优化了协程的使用方式.使得用Go来处理高并发问题 ...

  2. 在代码中实用协程(二)

    第一篇的链接:在代码中实用协程(一) 在网络处理程序中,一个协程正在接收网络请求者,一个协程正在循环发包,另一个协程中正发生错误,删除链接. 问题:是否可以循环链表同时进行删除和添加操作 先看一段流程 ...

  3. Boost:以协程的方式实现重构echo服务器的实例

    Boost:以协程的方式实现重构echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现重构echo服务器的实例 C++实现代码 #include < ...

  4. Boost:以协程的方式实现带有默认值的echo服务器的实例

    Boost:以协程的方式实现带有默认值的echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现带有默认值的echo服务器的实例 C++实现代码 #inc ...

  5. Boost:以协程的方式实现带有单个默认值的echo服务器的实例

    Boost:以协程的方式实现带有单个默认值的echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现带有单个默认值的echo服务器的实例 C++实现代码 ...

  6. Boost:以协程的方式实现echo服务器的实例

    Boost:以协程的方式实现echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现echo服务器的实例 C++实现代码 #include <boo ...

  7. Boost:以协程的方式实现聊天服务器的实例

    Boost:以协程的方式实现聊天服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现聊天服务器的实例 C++实现代码 #include <cstdlib ...

  8. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  9. 二十五、深入Python中的协程

    @Author: Runsen 一说并发,你肯定想到了多线程+进程模型,确实,多线程+进程,正是解决并发问题的经典模型之一.但对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能. ...

最新文章

  1. Java必会的面试题
  2. 不编程,拖拖鼠标图表自己动起来!来自图形学大牛陈宝权弟子,已获ACM CHI最佳论文荣誉提名...
  3. RHEL 7安装教程
  4. VTK:小部件之ImageTracerWidgetNonPlanar
  5. Ubuntu14.04下搭建LAMP环境
  6. 用计算机实现智能解题,浙江省信息技术学考复习模块2——计算机功能、智能处理、字处理...
  7. 【jzoj】2018.2.1 NOIP普及组——D组模拟赛
  8. ruby中正则表达式最小匹配与最大匹配
  9. 阿里合伙人程立:阿里15年,我撕掉了身上两个标签
  10. oracle clusterware 11g,Oracle11gR2clusterware启动顺序
  11. centos7和centos6 开机 运行级别详解和设置
  12. RTSP之主流安防厂家地址
  13. Python笔试面试题
  14. 成语接龙、歇后语 js JavaScript html web nodejs成语接龙离线js库
  15. netmeeting的使用(详解)
  16. linux下搭建redis内网端口映射工具-rinetd
  17. 推荐使用Ubutun16.04亮度调节工具
  18. 无条件呼叫前转接已启用
  19. CAN总线的学习总结
  20. Delphi 热键 使用WIN作为热键的组合键 给程序增加快捷键

热门文章

  1. Android Studio开发(六)短距离无线通信——蓝牙通信
  2. spring启动流程(一):启动流程概览
  3. Simpletron模拟器(二)
  4. 什么是 PHP? 为什么用 PHP? 有谁在用 PHP?
  5. 鸿蒙app前后端流程实现
  6. 计算机导论课后总结五
  7. java 国际象棋_java编程实现国际象棋棋盘
  8. 电脑重启后 虚拟机不见了?
  9. 如何实现视觉识别颜色
  10. 【成长访谈】周新林:靠持续的努力,总能换来自己期望的生活