【问题标题】:Multi Threaded Server with boost asio带 bo​​ost asio 的多线程服务器
【发布时间】:2012-01-15 10:56:33
【问题描述】:

我是否正在考虑使用 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 保护,线程将用于处理请求

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

【问题讨论】:

  • 这确实不是一个可以回答的问题,因为它目前正在编写。你的理解没有错。你有具体的问题吗?如果是这样,您可以发布一些代码吗?
  • 我只是想在继续实施之前确认我的假设/理解是正确的。我想你可能已经做到了,谢谢。我在 oast 中只有有限的 asio 经验,这将是我第一次打算在愤怒中使用它。
  • @mark 你写过这个服务器吗?我看过几个多线程异步服务器的例子,但这对我来说是开销。你能展示你的吗?

标签: c++ boost boost-asio


【解决方案1】:

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

不过,我想指出一个您可能没有发现的问题。

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

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

【讨论】:

  • 感谢您的回复。这是否意味着如果我防止从多个线程在同一个套接字上调用 async_write,则该链是不必要的?
  • 实际上,strands 应该在这里使用,但不是直接在 async_write 上,而是在队列上,你应该实现不交错 async_writes。您应该在我的一个问题stackoverflow.com/questions/7754695/… 中找到所有答案
  • 再次感谢 - Sam Miller 的解决方案看起来非常优雅
  • +1 表示“你不应该在同一个套接字上交错 async_write”
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多