c++ - 带 bo​​ost asio 的多线程服务器

标签 c++ boost boost-asio

我正在考虑使用 boost ASIO 编写一个多线程 tcp 服务器。我已经阅读了教程并查看了一些示例,只是想检查我的理解是否正确。

服务器将接受连接,然后为来自多个客户端的请求提供服务。

我的理解如下:

  1. 服务器使用“单个 io_service 和一个调用 io_service::run()”的线程池”
  2. 所有线程都调用io_service::run()
  3. 对 io_service::run() 的调用不在一个线程内,因此完成处理程序可以同时运行。
  4. 当请求到达时,选择其中一个线程,将调用其读取处理程序
  5. 另一个请求可能到达,在第二个线程上启动读取处理程序
  6. 当其中一个线程处理完请求后,它会从 strand 中调用 async_write
  7. 另一个线程也完成了其请求的处理,它还从链中调用 async_write
  8. io_service 的写入通过 strand 进行序列化,因此它们是线程安全的。
  9. 当写入操作完成时,线程调用async_read()
  10. 此调用不受strand保护,该线程将用于处理请求

我的理解正确吗?该解决方案容易受到竞争条件的影响吗?

最佳答案

正如萨姆·米勒所说,你的假设非常正确。

但是我想指出一个您可能没有发现的问题。

正确的是,strand 会序列化 async_write(s),因此线程安全。 但问题不在这里,如果不在同一个套接字上使用,async_write 本身就是线程安全的。而且链在这里不会有帮助,因为你不应该在同一个套接字上交错 async_write 。

Strands 不会在调用下一个 async_write 之前等待上一个 async_write 完成。仅当套接字上没有任何操作时,您才必须创建一个 async_write 结构。

关于c++ - 带 bo​​ost asio 的多线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869161/

相关文章:

c++ - 使用 boost 生成正态随机数的问题

c++ - basic_serial_port 和 async_read_until

c++ - PascalCase vs camelCase 函数?

c++ - 如何使用 Boost hana 递归创建 constexpr 列表?

boost - 无法在Windows 7 64位上的Cygwin下编译Boost 1.50.0

c++ - boost::asio 异步定时器作为中断

c++ - async_receive_from 没有收到所有东西

c++ - C++ 中的指针/多维数组

c++ - 嵌套函数调用快还是不快?

c++ - 返回指向嵌套 std::vector 项的指针的最佳方法