Boost Asio 沿一次性对象共享相同的 io_service

Posted

技术标签:

【中文标题】Boost Asio 沿一次性对象共享相同的 io_service【英文标题】:Boost Asio share same io_service along disposible objects 【发布时间】:2018-04-30 13:50:10 【问题描述】:

我正在开发一个程序,它由一堆活动对象组成,它们相互发送消息。我正在使用一个相同的 io_service 来初始化所有这些对象。所以他们正在努力结束软件的生命周期。

我正在使用活动对象,比如说,一个用于文件操作,另一个用于串行 IO,另一个用于本地数据库连接,一个用于通信所有这些。

但是我不能确定那些寿命很短的物体。我正在使用短期对象打开 tcp 套接字以向远程端点发送快速消息,然后立即处理套接字。我正在考虑使这些也异步。

问题是,我应该为这些短暂的对象使用相同的 io_service 还是应该为每个套接字创建一个新的 io_service ?

【问题讨论】:

【参考方案1】:

我正在开发一个程序,它由一堆活动对象组成,它们相互发送消息。我正在使用一个相同的 io_service 来初始化所有这些对象。所以他们正在努力结束软件的生命周期。

听起来很合适。如果您需要在具有多个处理器的机器上提高操作效率,我建议您使用 Chris Kohlhoff 的 recipe。

但是我不能确定那些寿命很短的物体。我正在使用短期对象打开 tcp 套接字以向远程端点发送快速消息,然后立即处理套接字。我正在考虑使这些也异步。

拥有很少(呃)长期存在的 asio io_service 对象(例如,您可以创建与机器上的处理器数量相同的 io_services)和使用 io_service 的短期对象并没有错。我想说这也更有效,因为您不必在每个(短暂的?)io_service 上启动线程来调用io_service::run,并且可以避免不必要的上下文切换。

如果您希望/需要避免线程阻塞,特别是在存在网络问题等情况下,也需要使套接字异步。

【讨论】:

谢谢@Ralf,我想问另一个。我在其中一个活动对象中生成了短暂的对象,共享相同 io_service 的合适方法是什么?我已经与 io_service 对象的直接地址共享以重用它。但是我不喜欢这种C方式。 通过“C方式”我假设你的意思是指针?我更喜欢传递 io_service 引用 (io_service& ) 并存储它们。这确实意味着您需要一个构造函数,它接受一个 io_service 参数并初始化成员引用。

以上是关于Boost Asio 沿一次性对象共享相同的 io_service的主要内容,如果未能解决你的问题,请参考以下文章

boost.asio - 如果在不同的异步处理程序之间共享数据库类型对象,我是不是需要使用锁?

Boost::Asio入门剖析

Boost Asio总结同步通信

Boost::Asio : io_service.run() vs poll() 或者我如何在主循环中集成 boost::asio

如何将 boost::asio::tcp::io_stream 附加到我的 io_service?

多线程和Boost::Asio