c++ - 在订阅时发送环形缓冲区的全部内容,然后发送新数据

标签 c++ linux boost-asio

我是 boost::asio 的初学者。

我需要编写一个从管道读取数据并将数据放入环形缓冲区的模块(我对如何实现这部分没问题)。

模块的另一部分等待消费者打开一个新的 TCP 连接或 unix 域套接字,当建立连接时,它发送完整的环形缓冲区内容,然后它会在被插入后立即发送任何新数据环形缓冲区。允许多个消费者,一个消费者可以随时打开一个新连接。

我想到的第一个天真的实现是为每个连接保留一个单独的 asio::streambuf 并在连接时将整个环形缓冲区推送到其中,然后是每个新数据,但这似乎是一个非常次优的方法在内存和 cpu 周期中,因为每个连接都必须复制数据,可能多次,因为我不知道 boost::asio::send(或 linux tcp/ip 堆栈)是否复制了数据。

因为我的想法是根本不使用多线程,所以我正在考虑使用某种形式的自定义 asio::streambuf 派生类,它与环形缓冲区共享实际缓冲区,但保持读取指针的单独状态无需任何锁。

在我看来,这是一个非常不寻常的需求,因为我找不到任何涉及类似主题的相关文档/问题,而且 boost 文档对我来说似乎非常简短和稀缺(参见例如:http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/basic_streambuf.html) .

如果有人可以向我指出一些想法,我可以将其作为实现我的设计的起点,或者如果他/她认为我的设计不好、无法实现和/或可改进,则可以向我指出替代设计。

最佳答案

你应该做你想做的事。

你绝对不需要 streambuf 来使用 Boost Asio:http://www.boost.org/doc/libs/release/doc/html/boost_asio/reference/buffer.html

如果问题是如何避免让生产者“等待”直到所有消费者(读取:连接)完成数据传输,您始终可以使用交替输出缓冲区的旧技巧

许多环形缓冲区实现允许一次直接拼接完整的元素序列(例如 boost lockfree spsc_queue cache memory access )。您可以利用这样的操作来发挥自己的优势。

也相关:

关于c++ - 在订阅时发送环形缓冲区的全部内容,然后发送新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392964/

相关文章:

c++ - QProcess:execute 阻止整个应用程序

c++ - 如何找到 "my"lib目录?

linux - 使用轮询和中断方法查找 CPU 效率

ssl - 使用客户端证书 sslv3 握手失败 boost asio GET

c++ - boost io_service 初始化 SIGSEGV

c++ - 如何通过 C++ 中的升压套接字发送 ostream?

C++结构类型重定义错误

C++ [链接器错误] undefined reference

C++泰勒级数初值微分方程精度估计

linux - 根据匹配行合并两个 csv 文件并在 linux 中添加新列