带有boost asio的多线程服务器

时间:2012-01-15 10:56:33

标签: c++ boost boost-asio

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

服务器将接受来自多个客户端的服务请求的连接。

我的理解如下:

  1. 服务器使用“单个io_service和一个调用io_service::run()
  2. 的线程池
  3. 所有线程都会调用io_service::run()
  4. io_service::run()的调用不在一个链中,ergo完成处理程序可以同时运行。
  5. 当请求到达时,其中一个线程被选中,其读取处理程序将被调用
  6. 另一个请求可能会到达,在第二个线程上启动读取处理程序
  7. 当其中一个线程处理完请求时,它会在async_write
  8. 内调用strand
  9. 另一个线程也完成处理它的请求,它也从一个链中调用async_write
  10. io_service的写入通过strand序列化,因为它们是线程安全的。
  11. 当写操作完成时,线程调用async_read()
  12. 此调用不受strand保护,该线程将用于处理请求
  13. 我的理解是否正确?这种解决方案是否容易受到竞争条件的影响?

1 个答案:

答案 0 :(得分:3)

正如萨姆·米勒所说,你的假设是完全正确的。

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

strands将序列化async_write(s)是正确的,因此会有线程安全。 但问题不在这里,async_write本身就是线程安全的,如果不在同一个套接字上使用的话。因为你不应该在同一个套接字上插入async_write,所以strands在这里没有帮助。

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