2012-02-16 102 views
0

我正在开发基于Boost :: Asio的网络服务器。阻止提升Asio工作线程

我有我使用调用IO工作线程的boost::thread_groupboost::asio::io_service::run()

当网络活动发生ASIO使用这些工作线程以处理活动中的一个(例如,接受或接收)。

我的应用程序然后做了一些工作,可能是一些计算,可能还有一些其他的IO(通过boost)以及可能的一些数据库活动。

我想知道在这些线程中做所述工作的含义。具体做法是:

  • 是否在IO线程导致 的io_service任何悲痛执行(可能显著工作)?

而不是特别的:我应该考虑的任何其他问题。

+1

我不清楚你是什么意思,通过从工作者线程回调'boost :: asio'。我希望所有的工作线程都将其他工作添加到'io_service'中,否则事件处理循环('io_service :: run()')将终止。 – 2012-02-16 22:43:32

+0

@Sam,谢谢 - 我想我可能对这个问题太担心了。我将编辑该问题。我想我真正关心的是在工作线程中做了太多工作。 – Nick 2012-02-17 08:43:26

回答

1

在IO线程 上执行(可能很重要的工作)是否会导致io_service发生任何悲伤?

这真的取决于你的意思是悲伤。在由io_service调用的处理程序中执行长时间运行操作可以阻止io_service调用其他处理程序。考虑最简单的例子,用一个线程调用io_service::run()。如果由异步操作(例如async_read())调用的处理程序然后执行一些可能长时间运行的数据库操作,则额外的未完成异步操作将不会调用它们的处理程序,直到长时间运行操作完成并且处理程序将控制返回到io_service

通常通过从多个线程调用io_service::run()并使用strand来确保独占访问使用共享数据的处理程序,从而缓解这种情况。尽管如果所有的处理程序都执行一些长时间运行的操作,您可能需要研究其他设计。