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

时间:2016-02-23 13:50:13

标签: c++ multithreading sockets networking boost-asio

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

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

管道中是否有任何东西可以帮助提高ASIO中UDP或单插槽TCP的效率?几乎所有ASIO示例都显示同步读写。即你只在最后一个处理程序中做另一个读或写。因此,每个套接字获得的好处很少,当然只有处理一个套接字时,没有什么能比专用的recv和写入线程更好。

我在这里遗漏了什么吗?

1 个答案:

答案 0 :(得分:1)

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

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