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

Posted

技术标签:

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

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

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

我的理解如下:

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

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

【问题讨论】:

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

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

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

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

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

【讨论】:

感谢您的回复。这是否意味着如果我防止从多个线程在同一个套接字上调用 async_write,则该链是不必要的? 实际上,strands 应该在这里使用,但不是直接在 async_write 上,而是在队列上,你应该实现不交错 async_writes。您应该在我的一个问题***.com/questions/7754695/… 中找到所有答案 再次感谢 - Sam Miller 的解决方案看起来非常优雅 +1 表示“你不应该在同一个套接字上交错 async_write”

以上是关于带 bo​​ost asio 的多线程服务器的主要内容,如果未能解决你的问题,请参考以下文章

在给定线程上使用同步 I/O 提升 asio 多线程 tcp 服务器

带 GUI 的多线程客户端/服务器聊天室

带参数的多线程如何去写?

带返回值的多线程

带继承的多线程 (C++)

C#中的多线程问题,为啥带参数的方法不行,不带参数的可以?