博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

asio 协程

Posted on 2015-10-19 12:58  bw_0927  阅读(224)  评论(0编辑  收藏  举报

http://www.godebug.org/index.php/archives/74/

https://remonstrate.wordpress.com/2012/10/08/coroutine-%E7%9A%84%E4%B8%A4%E7%A7%8D%E5%AE%9E%E7%8E%B0/

 

一般在异步程序中使用coroutine就是为了少写一些回调,使编写异步程序跟同步一样

如果一个协议里面要有顺序的读写几十次的话,对于同步的操作来说很简单,一路按照协议read、write、read、write下来就行了,但是异步的就不行了,你必须在上一个read或者write完成的handler中发起下一次的read或者write,协议稍微一复杂,回调函数就会多得让你恶心,这个时候coroutine就派上用场了,只需要一个回调函数,只要不停的调用就好了,函数会自动的按照你写得yield的顺序执行相应的代码,让代码看起来就像是同步的一样。

 

在同一个socket句柄上,不可以同时有多于一个异步读取或异步写入事件,必须等一个完成才能发下一个。

 

 

 

 

#include <iostream>
#include <boost/asio/yield.hpp>

int foo(boost::asio::coroutine& ct)
{
std::cout << "before reenter" << std::endl;

reenter(ct)
{
std::cout << "before yield1" << std::endl;
yield std::cout << "yield1" << std::endl;
std::cout << "before yield2" << std::endl;
yield return 1;
}

std::cout << "after reenter" << std::endl;
return 2;
}

int main(int argc, char* argv[])
{
boost::asio::coroutine ct;
while (!ct.is_complete())
{
int ret = foo(ct);
std::cout << "return:" << ret << std::endl;
}
return 0;
}

运行结果:

before reenter
before yield1
yield1
after reenter
return:2
before reenter
before yield2
return:1
before reenter
after reenter
return:2