Boost.asio 之协程
1.例程(routine)
例程只有一个入口和多个出口。例如常见的函数。
2.协程(coroutine)
泛化的例程。可以有多个入口多个出口,从最开始的入口进入之后,可以随时用yield调用返回,之后再调用协程就会从刚才返回的地方继续执行。
3.协程库
boost.coroutine
4.功能
以“同步”的方式实现异步调用
5.形式
stackless和stackful
6.头文件
<boost/asio/spawn.hpp>,并链接libboost_context.a, libboost_coroutine.a 和 libboost_thread.a
7.使用方法
demo
// coroutineServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <boost/asio.hpp> #include <boost/asio/spawn.hpp> using namespace boost::asio; int main() { typedef ip::tcp::acceptor acceptor_type; typedef ip::tcp::endpoint endpoint_type; typedef ip::tcp::socket socket_type; io_service io; //必须io_service对象 spawn(io, //使用spawn函数产生协程 [&](yield_context yield) //lambda表达式 { acceptor_type acceptor(io, endpoint_type(ip::tcp::v4(), 6688)); //acceptor对象 for (;;) //开始循环侦听 { socket_type sock(io); //一个socket对象 boost::system::error_code ec; //用于获取错误码 acceptor.async_accept(sock, yield[ec]); //使用协程,无handler if (ec) //检查错误码 { return; } auto len = sock.async_write_some( //异步写数据,获取字节数 buffer("hello coroutine."), yield); //使用协程,无handler std::cout << "send " << len << " bytes." << std::endl; } //侦听循环结束 } //服务lambda结束 ); //服务协程结束 io.run(); //启动事件循环 getchar(); std::cout << "Hello World!\n"; }
void spawn(strand s, Function function); //使用strand创建协程
void spawn(io_service io, Function funtion); //使用io_service创建协程
function必须符合如下函数签名:
void func(boost::asio::yield_context yield); //使用yield_context参数

浙公网安备 33010602011771号