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

时间:2011-03-19 00:12:28

标签: c++ boost boost-asio

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

你能开始多个io_services吗?这就是我想做的事情:

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

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

io_service A上的用户可以在io_service B上“发布”工作,以便在工作池上完成,但是在io_service A上没有工作,即主线程。

这可能吗?这有意义吗?

由于

2 个答案:

答案 0 :(得分:2)

根据我的经验,如果每个cpu一个io_service或每个进程一个表现更好,它实际上取决于应用程序。几年前关于这个主题的asio-users邮件列表进行了讨论。

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

通常,在使用Boost.Asio

创建应用程序时,应使用以下顺序
  1. 单线程
  2. 具有单个io_service
  3. 的线程池
  4. 具有某种CPU亲和力的多个io_service对象

答案 1 :(得分:1)

好问题!

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

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

另外,您可能想看看Sam Miller在WRT处理用户输入的不同帖子中指出的内容(即如果您使用的是控制台):https://stackoverflow.com/questions/5210796/boost-asio-how-to-write-console-server