C++ Boost.Asio - tcp 套接字异步写入

标签 c++ boost boost-asio

场景:

  1. 在对象 A(线程 A)中,boost::asio::ip::tcp::socket 正在异步读取和写入。

  2. 对象 B(线程 B)将数据发布到对象 A 的数据队列。

  3. 对象A应尽快将数据写入其数据队列。

如何高效的实现第三点?

现在我正在这样做:

  1. 队列中可能没有数据。

  2. socket->async_send(data, handler);

  3. 内部处理程序:回到第二点。

我担心这种方法效率非常低 - 大多数时候使用零长度数据调用 async_send,直到可以发送实际数据。

可能更好的方法是在对象 A 中有一个额外的线程,一旦发布新数据就在套接字上执行同步写入?从对象 B 的线程执行写入是不可能的。

最佳答案

首先,除非您有充分的理由这样做,否则我个人不会将其分解为每个对象 1 个线程。

取而代之的是,拥有一个共享的io_service(只需通过引用将其传入 A 和 B 构造函数。然后在 io_serice.run() 上拥有一个线程。

假设其中一个对象也是 async_reading,您无需编写 0 长度数据并在处理程序中创建循环。只需将 async_write 安排为数据进来的时间。

关于C++ Boost.Asio - tcp 套接字异步写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20873720/

相关文章:

c++ - 如何通过 boost asio 向客户端发送 OpenNI 深度图?

c++ - 为什么这个简单的 Boost::asio 程序不能按预期工作?

c++ - Boost Beast 异步服务器因断言失败而失败:(id_!= T::id) 在多个 aync 调用中

c++ - 使用 boost::circular_buffer<T> 作为 STL 容器

c++ - 如何授予对用户应用程序的根访问权限?

c++ - 使用 ld 创建依赖于另一个共享库的共享库

c++ - 数组名称是 C++ 中的常量指针吗?

C++ boost库无法打开文件

c++ - boost::bind 与映射,绑定(bind) std::pair 和 std::map::value_type 有什么区别?

c++ - 如何将虚拟 com 端口写入 TCP 驱动程序?