gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:57:13 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com