我正在学习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;
}
我错过了一些重要的区别吗? 另外,直观地递归调用回调对我来说似乎不是一个好主意,它仅仅是为了解释而在文档中给出的吗?
答案 0 :(得分:1)
我错过了一些重要的区别吗?
您的代码看起来没问题,并且与您链接的示例代码具有相同的行为。唯一真正的区别是您从封闭范围访问t
和count
,而不是使用参数。这样的简单示例就可以了,但是可能会为更复杂的代码带来问题。
同样递归地调用回调对我来说似乎并不是一个好主意,是否只是为了解释而在文档中给出了它?
从回调中再次调用async_wait
对于获得所需的行为至关重要。否则回调只会被调用一次。
链接这样的异步回调在小心完成时非常有用,但如果没有,很快就会导致难以理解/调试代码。
答案 1 :(得分:0)
您的代码似乎没问题。
你做的不是递归调用,因为deadlock_timer::async_wait
只发布一个事件并立即返回。回调实际上是从ioservice::run
中的循环调用的。