boost::asio::spawn 将一统C++网络库
(金庆的专栏)
boost::asio::spawn()创建一个协程,使C++网络编程大大简化,
个人认为这使得 asio 成为C++首选网络库。
boost::asio::spawn(my_strand, do_echo);
一般输入2个参数,参数1是 io_service 或者是 strand,
参数2是协程函数,类型如下:
void coroutine(boost::asio::yield_context yield);
在协程函数中调用各个异步IO,异步操作将挂起协程,待异步操作完成后会自动继续协程。
示例:
    // See: doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp    try    {        boost::asio::io_service io_service;        using std::placeholders::_1;        using std::ref;        boost::asio::spawn(io_service,            std::bind(LoopAccept, ref(io_service), unPort, _1));        io_service.run();    }    catch (std::exception& e)    {        std::cerr << "Exception: " << e.what() << "\n";    }LoopAccept() 是实际的协程函数
// Accept coroutine.static void LoopAccept(boost::asio::io_service& io_service,    unsigned short port, boost::asio::yield_context yield){    using boost::asio::ip::tcp;    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port));    for (;;)    {        boost::system::error_code ec;        std::shared_ptr<CAsioSvrSession> pSession(            new CAsioSvrSession(io_service));        acceptor.async_accept(pSession->GetSocket(), yield[ec]);        if (ec) continue;        pSession->Go();  // Will spawn read and write coroutine.    }}