Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ asio在线程中启动不同的服务?_C++_Boost_Boost Asio - Fatal编程技术网

C++ asio在线程中启动不同的服务?

C++ asio在线程中启动不同的服务?,c++,boost,boost-asio,C++,Boost,Boost Asio,似乎所有示例都显示在所有线程中运行相同的io_服务 您可以启动多个io_服务吗?以下是我想做的: 在主线程中启动io_服务A以处理用户输入 在另一个线程中启动另一个io_服务B,然后可以启动一组工作线程 线程所有共享io_服务B io_服务A上的用户可以“发布”io_服务B上的工作,以便在工作池上完成,但不需要在io_服务A(即主线程)上完成任何工作 这可能吗?这有意义吗 谢谢好问题 是的,这是可能的。在我目前正在开发的一个应用程序中,我将该应用程序分解为负责系统不同方面的独立组件。每个组件在自

似乎所有示例都显示在所有线程中运行相同的io_服务

您可以启动多个io_服务吗?以下是我想做的:

在主线程中启动io_服务A以处理用户输入

在另一个线程中启动另一个io_服务B,然后可以启动一组工作线程 线程所有共享io_服务B

io_服务A上的用户可以“发布”io_服务B上的工作,以便在工作池上完成,但不需要在io_服务A(即主线程)上完成任何工作

这可能吗?这有意义吗

谢谢

好问题

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

所以回到你的问题上来,你可以做任何你想做的事情,在我看来,这更像是一个尝试的案例,如果你遇到任何问题,就改变它


另外,您可能想看看Sam Miller在处理用户输入的另一篇博文(即如果您使用的是控制台)中指出的内容:

根据我的经验,如果每个cpu或每个进程都有一个
io\U服务,那么这实际上取决于应用程序。几年前,邮件列表上有一个关于这个话题的讨论

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

通常,在使用Boost.Asio创建应用程序时,应该使用以下顺序

  • 单螺纹
  • 具有单个
    io\u服务的线程池
  • 具有某种CPU亲缘关系的多个
    io\U服务
    对象

  • +1用于链接到显示posix::stream_描述符用法的答案。+1有趣的讨论:),使我对我的系统设计感到好奇,尽管我还没有遇到任何问题。在这种情况下,我有一个应用程序,它有一个线程和一个处理套接字和stdio的io_服务,这是旧的非线程保存代码。现在我想添加一个工作线程池,它有自己的io_服务,并且不会与主线程上的非线程安全代码交互。工作池将在单独的数据上运行一些单独的代码,通信将通过主io_服务和线程池中运行的io_服务之间的io_服务POST进行。听起来这是可以做到的吗?@Oliver是的,听起来是可以做到的。不过,如果这是我的任务,我会用线程修复非线程安全的代码,并使用单个io_服务和调用io_服务::run()的线程池。