我是 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 作为参数的对象或函数? 感谢您的帮助!
答案 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));
查看更多背景: