我想从一个非常慢的设备(读取速度=1Mo/s)上的文件中解压数据。解压缩算法至少可以执行此速度的三倍。 在 C/C++ 中并行化这些任务的最快方法是什么,这样读取过程就不会因解压缩而减慢,从而使用最大带宽。
我已经用常规管道尝试了两个线程。但我不知道这是否是最好的解决方案。至少它不是零拷贝算法。 我当前的算法是错误的,因为我无法成功地在管道上执行阻塞 IO。 (试过 fcntl 或 fread/fdopen)
我的无双程序很简单。像
while(remainingToRead > 0){
int nb = fread(buffer, 1, bufferSize);
decompress(buffer, nb, bufferOut);
nb -= remainingToRead
}
最佳答案
这里的一个解决方案是使用单独的线程来读取和解压缩,并使用两个缓冲区,以便这些操作可以重叠。
伪代码:
阅读线程:
while (not finished)
{
while (no buffers free)
wait on condition variable
fill next buffer
mark buffer in use
set condition variable for decompression thread
}
解压线程:
while (not finished)
{
while (no buffers full)
wait on condition variable
decompress next buffer
mark buffer free
set condition variable for read thread
}
请注意,要使其正常工作需要正确处理大量细节 - 多线程编程总是很棘手。
关于c++ - 简单快速读取过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339558/