我很难理解为什么有些程序员在只有一个套接字时推荐异步 IO,例如 UDP 的常见情况。这更针对 ASIO,它是我们将在 C++17 中获得的基础,但通常适用于任何异步库。
有没有有意义的用例?我看不出性能会比两个线程更好,一个在读取时阻塞(然后为线程池排队数据包),另一个在写入时阻塞,条件变量等待数据包发送。最好在那里使用多数据包功能以避免操作系统开销。
管道中有什么可以帮助 ASIO 中 UDP 或单套接字 TCP 的效率吗?几乎所有的 ASIO 示例都显示了同步读写。也就是说,您只在最后一个处理程序中进行另一次读取或写入。因此,每个套接字几乎没有什么好处,如果只处理一个套接字,那么对于这些示例来说,没有什么比专用的接收和写入线程更好的了。
我是不是漏掉了什么?
最佳答案
一般来说,ASIO 可能产生比多线程更差的性能。有了真正的多线程和多核(如今的标准),您将有机会同时为两个客户端提供服务(单线程 ASIO 模型永远不会发生这种情况)。但是,例如,如果您的任务是 IO 绑定(bind)的,使用具有同步访问的公共(public)资源(例如,单线程数据库)或受任何其他锁的约束,那么多线程的任何好处都将消失。
另一方面,ASIO 模型要简单得多,不需要任何同步,允许在单线程模式下编译程序(因此,例如,提高内存分配的性能,消除对原子访问的需要, ETC)。在许多情况下,这些好处超过了缺点。
关于c++ - 处理一个套接字和多个线程时异步 IO 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579353/