【发布时间】:2012-01-15 10:56:33
【问题描述】:
我是否正在考虑使用 boost ASIO 编写多线程 tcp 服务器。我已经阅读了教程并查看了一些示例,只是想检查一下我的理解是否正确。
服务器将接受连接,然后服务来自多个客户端的请求。
我的理解如下:
- 服务器使用“单个
io_service和一个线程池调用io_service::run()” - 所有线程都调用
io_service::run()。 - 对
io_service::run()的调用不在一个链中,因此完成处理程序可以同时运行。 - 当请求到达时,选择其中一个线程,将调用其读取处理程序
- 另一个请求可能到达,在第二个线程上启动读取处理程序
- 当其中一个线程完成处理请求时,它从
strand中调用async_write - 另一个线程也完成了对它的请求的处理,它也从一个链中调用
async_write - 对
io_service的写入通过strand进行序列化,因此它们是线程安全的。 - 当写操作完成时线程调用
async_read() - 此调用不受
strand保护,线程将用于处理请求
我的理解正确吗?此解决方案是否容易受到竞争条件的影响?
【问题讨论】:
-
这确实不是一个可以回答的问题,因为它目前正在编写。你的理解没有错。你有具体的问题吗?如果是这样,您可以发布一些代码吗?
-
我只是想在继续实施之前确认我的假设/理解是正确的。我想你可能已经做到了,谢谢。我在 oast 中只有有限的 asio 经验,这将是我第一次打算在愤怒中使用它。
-
@mark 你写过这个服务器吗?我看过几个多线程异步服务器的例子,但这对我来说是开销。你能展示你的吗?
标签: c++ boost boost-asio