我必须从电路板读取数据,该电路板以非常高的速度生成数据。我必须快速读取这些数据,解析它并写入另一个文件。由于读取操作是以非常高的速度进行的,因此我必须在C ++中实现两个线程。因此,一个线程读取,另一个线程将数据写入文件。由于读写缓冲区相同,因此无法使用锁定机制。使用Ring缓冲区实现不是一个好的解决方案。还有其他想法用C ++实现它不会降低读取速度吗?
答案 0 :(得分:1)
将两个文件映射到内存中。使用大读取和写入大小等于页面大小倍数的缓冲区。在新文件中使用异步内存写入。启动两个线程,一个用于读取,另一个用于写入。在两个线程之间建立通信消息,以便在读取新文件部分时将其可用性传递给第二个线程。同时你在第二个缓冲区读取一个新的文件部分,解析和写入线程可以使用它的缓冲区。完成此解析和写入操作后,将其传递给第一个线程以重新使用此缓冲区。
答案 1 :(得分:1)
通常最好让操作系统处理所有优化。所以,我会使用某种mmap工具 - 在Linux / Unix上进行mmap(2)系统调用,或在Win32上使用MemoryMapOfFile。
这样做是指示操作系统使用常规虚拟内存子系统将文件视为内存位置。这意味着系统以全局最优的方式管理缓冲,通常被认为是最佳的。
这是一个很好的思考:
答案 2 :(得分:0)
首先不要使用文件,如果你想要良好的性能,请在RAM中处理。第二,如果您提供更多信息会有所帮助 - 您正在阅读的内容是什么?
答案 3 :(得分:0)
我建议使用condition variable来表示作者已经准备好了缓冲区。将引用缓冲区放在队列中也很方便,因此编写器可以处理多个缓冲区 请注意,如果数据的速度快于可以处理的速度,那么在某些时候会出现拥塞。