我正在开发基于 Boost :: Asio 的网络服务器。
我有boost::thread_group
IO工作线程,我用它来调用boost::asio::io_service::run( )
网络活动发生时 ASIO 使用其中一个工作线程来处理活动(例如,接受或接收)。
我的应用程序然后做了一些工作,可能是一些计算,可能还有其他一些IO(通过boost)以及可能的一些数据库活动。
我想知道在这些线程中完成所述工作的含义是什么。具体做法是:
io_service
任何悲伤?不太具体:我应该考虑的任何其他问题。
答案 0 :(得分:1)
在IO线程上执行(可能是重要的工作) 导致io_service任何悲伤?
这真的取决于你的悲伤意味着什么。在由io_service
调用的处理程序中执行长时间运行的操作可能会阻止io_service
调用其他处理程序。考虑使用单个线程调用io_service::run()
的最简单示例。如果异步操作调用处理程序,比如async_read()
然后执行一些可能长时间运行的数据库操作,那么在长时间运行的操作完成并且处理程序将控制权返回到控制器之前,其他未完成的异步操作将不会调用其处理程序。 io_service
。
这通常通过从多个线程调用io_service::run()
并使用strand
来确保对使用共享数据的处理程序的独占访问来缓解。虽然如果所有处理程序都执行一些长时间运行的操作,您可能需要研究替代设计。