一个类ring buff的ping pong buff实现

代码参考于:https://github.com/dennis-musk/pingpong_buffer.git

我的代码:https://github.com/Mr-jinfa/ping-pong-buff--like-ring-buff

      貌似好久没更新博客,因为这段时间浸淫于Android、音视频。虽然两个都学得不咋地,不过还是有点点收获。至少遇到某函数时再也不会叫函数,而是尊称为“方法”。。


    本文本着分享模块间数据交互的性能优化手段及其基础知识,展示一个可用案例供读者试验/移植/优化。本文代码移植于这里,我改进后的代码在这里

    先看下大众化的串行编程模型示例图

 

   

    可以看到,由于串行编程只有一条执行路径(线程),所以遇到添加不满足时只能不断地轮询条件可得。这样编码模式适用于条件分支判断,不适用于当程序依赖某个关键条件的情况。

    再看下用于提高性能的并行的编程模型示例图

PingPong Buffer是一种内存管理技术,用于提高数据交换性能,特别是在多线程或者异步编程环境中。它通过在两个缓冲区之间来回传递数据而不是直接在主线程和工作线程间共享数据来减少争用。下面是一个简单的C++示例,演示了如何创建一个32字节大小的PingPong Buffer: ```cpp #include <iostream> #include <thread> #include <mutex> // PingPong Buffer 定义 class PingPongBuffer { private: std::byte buffer[32]; mutable std::mutex lock; int index = 0; // 当前读写索引 public: // 获取下一个可用位置写入 std::byte* write() { std::lock_guard<std::mutex> guard(lock); return index % 32 ? &buffer[index] : &buffer[0]; // 使用取模运算保证循环 index++; } // 从上一个已写的位置开始读取 std::byte* read() const { std::lock_guard<std::mutex> guard(lock); return index % 32 ? &buffer[index] : &buffer[31]; // 读取时同样考虑循环 // 注意这里不需要更新index,因为我们只是读取 } }; void worker(PingPongBuffer& buffer) { for (int i = 0; i < 100; ++i) { std::byte* data = buffer.write(); // 写入数据 // 对数据进行处理... std::cout << "Worker wrote to: " << static_cast<int>(data - buffer.buffer) << "\n"; } } int main() { PingPongBuffer buffer; std::thread worker_thread(worker, std::ref(buffer)); // 创建一个工作线程 for (int i = 0; i < 100; ++i) { std::byte* data = buffer.read(); // 主线程读取数据 // 对数据进行处理... std::cout << "Main thread read from: " << static_cast<int>(data - buffer.buffer) << "\n"; } worker_thread.join(); // 等待工作线程完成 return 0; } ``` 在这个例子中,`worker`函数在缓冲区上交替进行写操作,而主线程负责读取。这样可以避免数据竞争并提高并发性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值