【问题标题】:Is my code equivalent to the one given in the Boost.Asio tutorial?我的代码是否等同于 Boost.Asio 教程中给出的代码?
【发布时间】:2013-10-10 08:51:31
【问题描述】:

我正在学习 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;
}

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

【问题讨论】:

  • 如果你使用c++11,值得使用类型推导:auto cb = ....
  • @IgorR.: 不会编译,因为在推导类型之前使用了对象。
  • 对,错过了这一点...

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


【解决方案1】:

我是否遗漏了一些重要的区别?

您的代码看起来不错,并且与您链接到的示例代码具有大致相同的行为。唯一真正的区别是您从封闭范围访问tcount,而不是使用参数。在像这样的简单示例中这是可以的,但会为更复杂的代码引入问题。

从直觉上看,递归调用回调对我来说似乎不是一个好主意,是不是为了解释而在文档中给出的?

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

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

【讨论】:

  • 谢谢,你能想出一个不那么“笨拙”的链接模式吗?
  • @manasij7479 :这完全取决于你想做什么。如果您想在给定的时间间隔内多次调用一个函数(这是示例所示),并且希望使用异步调用来执行此操作,那么所提供的方式是合适的。唯一真正的选择是在一个循环中同步地做所有事情,并在睡眠左右。
  • @manasij7479 :您需要一段时间才能了解异步模型。这不是万能的解决方案,但在某些情况下它会大放异彩。诀窍是知道何时使用它,何时避免使用它(就像使用每个工具一样)。
  • @manasij7479 另一种方法是使用协程:boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/…
【解决方案2】:

您的代码似乎没问题。

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

【讨论】:

  • auto 不会编译,因为在推导类型之前使用了对象 cb。
  • @manasij7479,你试过了吗?找不到“在推断类型之前使用对象cb”的位置?
  • 真的,我错过了这个“内部”行。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2016-02-14
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多