如何在插件 [模块] 之间共享 boost::asio::io_service

How to share boost::asio::io_service across plugins [modules]

本文关键字:boost asio io service 共享 之间 插件 模块      更新时间:2023-10-16

我想实现一个单线程应用程序,它也提供了一个插件/模块API。我的应用程序正在使用在类方法中实例化/初始化的静态io_service。它可能被一些人称为单例。将其提供给插件实现者是个好主意吗?

boost::io_service& SomeClass::IOS()
{
static boost::io_service ios;
return ios;
}

首先,我想允许插件仅提供文件描述符,并且应用程序将它们包装为stream_descriptor对象,但这会阻止boost提供io_object特定功能;这就是我想向插件实现者提供静态io_service并限制它们仅使用io_object实例的原因。

我认为,如果您的架构基于boost::asio,那么直接将io_service公开为单例没有问题。

关于 ABI 的问题在每个C++插件架构中都是通用的, 而不是特定于boost::asio. 因此,包装io_service(如理查德所建议的那样)不是解决此问题的方法,而只是隐藏使用asio的决定的一种方式。

顺便说一句:我想你想允许插件通过asio来管理 I/O,并且主应用程序调度任务,所以你的包装器暴露postdispatch是不够的(对插件没用),你应该提供例如套接字和其他 I/O 方法。