为什么 boost::asio::io 服务被设计为用作参数?

时间:2021-07-29 16:32:53

标签: c++ boost boost-asio asio

我是 c++ asio 的初学者,发现如何使用 io_service 非常令人困惑。

我对 io_service 的理解是,它是一个任务队列。 就像你在 python 中使用的一样:

asyncio.gather(*[task1, task2...])

将您的任务放入此队列,然后运行循环。

然而,在 C++ 中,io_service 被用作传递给其他一些东西的参数。

如示例所示https://www.boost.org/doc/libs/1_76_0/doc/html/boost_asio/tutorial.html。 io_serivce 用作传递给对象或函数的参数,例如此处。它传递给计时器:

  boost::asio::io_context io;

  boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));

或者喜欢

    boost::asio::io_context io_context;
    tcp_server server(io_context);

我的问题是,为什么要这样做? 将 io_service 传递给函数或对象有什么神奇之处,但传递的 io_service 持有任务?例如。定时器任务现在在 io_service 的队列中。

如果我要定义一个自定义函数,也许可以使用 opencv 来读取图像而不是 asio、timer socket 等中的预定义任务。 我应该如何创建接受 io_service 作为参数的对象或函数? 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在过去几年中,您实际上可以传递执行程序,这比传递对您的服务的引用要好得多。所以,改为这样做。

一般来说,这个原则被称为依赖注入,无论具体接口如何,您都需要以一种或另一种方式使用它。

最后,选择自由函数而不是成员操作是一种明显的Pythonesque选择,这在传统的面向对象编程语言中很少见。这个想法,例如鼓励你写

 post(executor, task);

代替

 executor.post(task);

非常类似于您说的 Pythonesque 模式,例如str(obj)len(obj) 而不是 obj.str()obj.len()

请注意,C++ 增加了更多的余地,如果任务具有关联的执行器,您可以简单地说

 post(task);

它的行为等同于 post(get_associated_executor(task), task));

<块引用>

查看更多背景:

相关问题