boost::asio 在线程中启动不同的服务?

Posted

技术标签:

【中文标题】boost::asio 在线程中启动不同的服务?【英文标题】:boost::asio starting different services in threads? 【发布时间】:2011-03-19 00:12:28 【问题描述】:

似乎所有示例总是显示在所有线程中运行相同的 io_service。

你能启动多个 io_services 吗?这是我想做的:

在主线程中启动io_service A来处理用户输入...

在另一个线程中启动另一个io_service B,然后可以启动一堆worker 线程都共享 io_service B。

io_service A 上的用户可以在 io_service B 上“发布”工作,以便在工作池上完成,但不会在 io_service A 上完成任何工作,即主线程。

这可能吗?这有意义吗?

谢谢

【问题讨论】:

【参考方案1】:

根据我的经验,如果每个 cpu 或每个进程一个 io_service 性能更好,这真的取决于应用程序。几年前在asio-users 邮件列表上就这个话题进行了讨论。

Boost.Asio 文档在 HTTP Server 2 和 HTTP Server 3 示例中有一些很好的示例 showing these two 技术。但请记住,第二个 HTTP 服务器只是展示了如何使用这种技术,而不是何时或为什么使用它。这些问题需要通过分析您的应用程序来回答。

一般来说,使用 Boost.Asio 创建应用程序时应该使用以下顺序

    单线程 具有单个io_service 的线程池 具有某种 CPU 关联性的多个 io_service 对象

【讨论】:

+1 有趣的讨论 :),虽然我还没有遇到任何问题,但让我对我的系统设计感到好奇。 情况是这样,我有一个应用程序,它有一个线程和一个处理套接字和 stdio 的 io_service,它是旧的非线程保存代码。现在我想添加一个工作线程池,它有自己的 io_service 并且不会与主线程上的非线程安全代码交互。工作池将在单独的数据上运行一些单独的代码,并且通信将通过主 io_service 和线程池中运行的 io_service 之间的 io_service 帖子进行。听起来这样可以吗? @Oliver 是的,听起来可以做到。不过,如果这是我的任务,我会用 strands 修复非线程安全代码,并使用单个 io_service 和调用 io_service::run() 的线程池。【参考方案2】:

好问题!

是的,这是可能。在我目前正在处理的应用程序中,我已将应用程序分解为负责系统不同方面的单独组件。每个组件在自己的线程中运行,有自己的一组计时器,使用 asio 进行自己的网络 I/O。从可测试性/设计的角度来看,它对我来说似乎更干净,因为没有组件可以干扰另一个组件,但我需要得到纠正。我想我可以重写作为参数传入 io 服务的所有内容,但目前还没有发现需要这样做。

所以回到你的问题,你可以做任何你想做的事,IMO 更多的是尝试一下,如果遇到任何问题就改变它。

另外,您可能想看看 Sam Miller 在 WRT 处理用户输入的另一篇文章中指出的内容(也就是说,如果您使用的是控制台):https://***.com/questions/5210796/boost-asio-how-to-write-console-server

【讨论】:

+1 用于链接到我的答案,显示 posix::stream_descriptor 用法。

以上是关于boost::asio 在线程中启动不同的服务?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Asio、tcp::iostream 和多线程

从多个线程调用 boost::asio::io_service 运行函数

Boost asio程序在多线程上崩溃

Boost asio 中的 TCP 客户端

使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?

多线程中boost asio中的随机EOF