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

标签 c++ multithreading sockets networking boost-asio

我很难理解为什么有些程序员在只有一个套接字时推荐异步 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/

相关文章:

python - 为什么写入后文件为空?

使用 Apache Mina 的 Java socketserver - 如何设置线程?

c++ - 与默认 IF 相比,简写 IF 是否会提高效率?

c++ - 这个指针类型是什么以及如何使用它?

python - 如何使用装饰器和线程返回函数值

python - PYZMQ REQ-REP 多客户端 ZMQError 与轮询

java - 无法从某些 wsdl 生成 java 客户端代码

c++ - 引用静态函数局部变量

c++ - 尽管签名匹配示例和源代码,但 vulkan 图形管道的参数错误

类方法上的python线程计时器