我的代码是否等同于Boost.Asio教程中给出的代码?

时间:2013-10-03 15:15:56

标签: c++ boost c++11 lambda boost-asio

我正在学习Boost.Asio,这是我正在谈论的代码: Link to code

我写的以下代码看起来是一样的并且有效: (使用“-lboost_system”和“-std = c ++ 11”编译)

#include<iostream>
#include<boost/asio.hpp>
#include<functional>
#include<boost/date_time/posix_time/posix_time.hpp>

typedef const boost::system::error_code cbse;
int main()
{
    boost::asio::io_service io;

    boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));

    int count=0;

    std::function<void(cbse&)> 
    cb=[&](cbse&)
    {
        if(count<5)
        {
            std::cout<<"foo"<<std::endl;
            count++;
            t.expires_at(t.expires_at()+boost::posix_time::seconds(1));
            t.async_wait(cb);
        }
        else
            std::cout<<"done"<<std::endl;
    };

    t.async_wait(cb);

    std::cout<<"Hello"<<std::endl;

    io.run();

    return 0;
}

我错过了一些重要的区别吗? 另外,直观地递归调用回调对我来说似乎不是一个好主意,它仅仅是为了解释而在文档中给出的吗?

2 个答案:

答案 0 :(得分:1)

  

我错过了一些重要的区别吗?

您的代码看起来没问题,并且与您链接的示例代码具有相同的行为。唯一真正的区别是您从封闭范围访问tcount,而不是使用参数。这样的简单示例就可以了,但是可能会为更复杂的代码带来问题。

  

同样递归地调用回调对我来说似乎并不是一个好主意,是否只是为了解释而在文档中给出了它?

从回调中再次调用async_wait对于获得所需的行为至关重要。否则回调只会被调用一次。

链接这样的异步回调在小心完成时非常有用,但如果没有,很快就会导致难以理解/调试代码。

答案 1 :(得分:0)

您的代码似乎没问题。

你做的不是递归调用,因为deadlock_timer::async_wait只发布一个事件并立即返回。回调实际上是从ioservice::run中的循环调用的。