c++ - 简单快速读取过程

标签 c++ c multithreading

我想从一个非常慢的设备(读取速度=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/

相关文章:

c++ - 重构单例/全局以使用依赖注入(inject)进行单元测试

C++ Ranges TS 包括实验路径

c++ - Openssl,无效参数 ' Candidates are: int BN_set_word(bignum_st *, ?) '

python - 一起使用模拟 (MyHDL) 和 wxPython

c++ - Cocos2d-x : Convert from CCTime to SEL_SCEDULE error

c++ - 哪个版本的 GNU GCC 支持 TR1 外部模板?

c - 显示二维数组

c - Linux asm ("int $0x0") 与除以零

java - 使用线程每隔一分钟序列化一个 TreeMap

java - 线程运行了一个我无法控制的无限操作。如何停止呢? [复制]