c++ - 阻塞 Boost Asio 工作线程

标签 c++ boost boost-asio

我正在开发一个基于 Boost::Asio 的网络服务器。

我有一个 boost::thread_group 的 IO 工作线程,我用它来调用 boost::asio::io_service::run( )

当网络事件发生时,ASIO 使用这些工作线程之一来处理事件(例如接受或接收)。

然后我的应用程序会做一些工作,可能是一些计算,可能是一些其他 IO(通过 boost)和一些数据库事件。

我想知道在这些线程中进行上述工作的含义是什么。具体来说:

  • 是否在 IO 线程上执行(可能是重要的工作)会导致 io_service 有什么遗憾吗?

更具体地说:我应该考虑的任何其他问题。

最佳答案

Does carrying out ( possibly significant work ) on the IO threads cause the io_service any grief?

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

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

关于c++ - 阻塞 Boost Asio 工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312367/

相关文章:

c++ - 如何在我的 Boost::asio tcp 服务器刚开始运行时启动 "event"(AKA io_service.run())?

c++ - Xlib如何在不同的程序中使用XSaveContext/XFindContext

java - 将 protobuf 从 C++ 发送到 Java

c++ - 如何从 boost 库中取出单个元素(例如 shared_ptr)?

c++ - 来自 Boost.Atomic 示例的无等待队列崩溃

c++ - boost asio io_service 多线程性能不佳

c++ - boost async_read 与阻塞同步线程 - 性能差异?

c++ - 如何使用 LuaBind 将 std::map 绑定(bind)到 Lua

c++ - 如何让qlabel在场景中跟随光标

c++ - boost 多阵列 3D