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参数

posted @ 2019-05-15 15:11  N_zero  阅读(3007)  评论(0)    收藏  举报