处理一个套接字和多个线程时异步 IO 的用例

Use case for async IO when dealing with one socket and multiple threads

本文关键字:异步 IO 线程 一个 处理 套接字      更新时间:2023-10-16

我很难理解为什么一些程序员在只有一个套接字的情况下推荐异步 IO,就像 UDP 的常见情况一样。这更针对ASIO,这是我们将在C++17中获得的基础,但通常适用于任何异步库。

是否有有意义的用例?我看不出性能会比两个线程更好,一个阻塞读取(然后将数据包排队等待线程池),另一个阻塞写入,条件变量等待数据包发送。最好在那里使用多数据包功能以避免操作系统开销。

是否有任何有助于 ASIO 中 UDP 或单插槽 TCP 的效率?几乎所有的ASIO示例都显示了同步读取和写入。即,您只在处理程序中对最后一个进行另一次读取或写入。因此,每个套接字获得的好处很少,如果只处理一个套接字,那么对于这些示例,当然没有什么比专用的recv和写入线程更好的了。

我在这里错过了什么吗?

一般来说,ASIO 可能产生比多线程更差的性能。使用真正的多线程和多核(现在的标准),您将有机会同时为两个客户端提供服务(单线程ASIO模型永远不会发生这种情况)。但是,例如,如果您的任务是 IO 密集型的,使用具有同步访问的公共资源(例如单线程数据库)或受到任何其他锁的影响,则多线程的任何好处都将消失。

另一方面,ASIO模型要简单得多,不需要任何同步,允许在单线程模式下编译程序(因此,例如,提高内存分配的性能,消除对原子访问的需求等)。在许多情况下,这些好处大于缺点。