如何在 C++ 中处理完整的 CircularBuffer
How to handle a full CircularBuffer in C++
这是一个一般性问题,我是 C++ 的新手,我正在玩一个项目,该项目以 1 毫秒的间隔从工作线程中的 serial/usb 端口读取数据到循环缓冲区中,我还有另一个GUI UI 线程,每 100 毫秒抓取一次数据。当数据备份并且数据缓冲区变满时会发生什么,我不想阻塞,我需要获取数据,因为它不需要等待。这种情况下的常见做法是什么?我是为 "extras" 创建另一个缓冲区,还是让原始缓冲区更大?
谢谢
您可以使用循环缓冲区,在缓冲区满时分配更多内存。
如果您对创建自己的循环缓冲区不感兴趣,可以使用boost's one,或者将其作为参考。
我会把它放在评论中,但因为我不能:你不能调整缓冲区大小有什么原因吗?
如果不是,我看不出有任何理由不应该使用缓冲区来为您提供一些安全空间,毕竟这就是缓冲区的用途。
说白了,你完蛋了
现在,让我们看看事情有多糟糕,有多种方法可以处理缓冲区溢出:
- 删除一些数据,可以选择静默删除。您必须决定是从开头删除数据还是从结尾删除数据效果更好。
- 合并一些数据以释放缓冲区中的 space。
- 手头有一个紧急缓冲区来捕获溢出。
- 中止操作,必须彻底重做。
- 忽略错误并假装它永远不会发生。结果可能很有趣,也很出乎意料。
- 重新设计以加快交接/处理速度。
- 为峰值吞吐量重新设计更大的缓冲区。
无论如何,如果您想了解更多相关信息,请查看实时和软实时编程。
这是一个一般性问题,我是 C++ 的新手,我正在玩一个项目,该项目以 1 毫秒的间隔从工作线程中的 serial/usb 端口读取数据到循环缓冲区中,我还有另一个GUI UI 线程,每 100 毫秒抓取一次数据。当数据备份并且数据缓冲区变满时会发生什么,我不想阻塞,我需要获取数据,因为它不需要等待。这种情况下的常见做法是什么?我是为 "extras" 创建另一个缓冲区,还是让原始缓冲区更大?
谢谢
您可以使用循环缓冲区,在缓冲区满时分配更多内存。
如果您对创建自己的循环缓冲区不感兴趣,可以使用boost's one,或者将其作为参考。
我会把它放在评论中,但因为我不能:你不能调整缓冲区大小有什么原因吗?
如果不是,我看不出有任何理由不应该使用缓冲区来为您提供一些安全空间,毕竟这就是缓冲区的用途。
说白了,你完蛋了
现在,让我们看看事情有多糟糕,有多种方法可以处理缓冲区溢出:
- 删除一些数据,可以选择静默删除。您必须决定是从开头删除数据还是从结尾删除数据效果更好。
- 合并一些数据以释放缓冲区中的 space。
- 手头有一个紧急缓冲区来捕获溢出。
- 中止操作,必须彻底重做。
- 忽略错误并假装它永远不会发生。结果可能很有趣,也很出乎意料。
- 重新设计以加快交接/处理速度。
- 为峰值吞吐量重新设计更大的缓冲区。
无论如何,如果您想了解更多相关信息,请查看实时和软实时编程。