使用多线程读写同一个文件而不使用mmap?

问题描述 投票:0回答:1

相关:多线程读取同一文件

mmap 可用于读写文件,但不支持大文件,例如在 32 位系统上。

C 中的 stdio FILE* 或 Linux 文件句柄,另一方面,可以处理大文件,只不过它们在文件内有一个通过

ftell
获得的位置。这意味着,即使对于读取操作,我们也不能在多个线程中使用相同的文件处理程序(没有锁)。如果创建多个句柄,则写入可能无法安全地并行进行。

是否有一个好方法来克服上述两种方法的缺点,让多个线程并行访问大文件(在不相交的块上写入)?

当然,有时候不使用锁是不可能的。但理想情况下,在存储设备支持并行访问的情况下,最好有一种从存储设备读取数据而无需不必要的锁的方法。

c multithreading file thread-safety mmap
1个回答
0
投票

有两种可能:

  1. 为每个线程打开一次文件,通过

    fopen()
    获取
    FILE*
    或通过
    open()
    获取文件描述符。然后,每个线程都可以安全地并行读取和写入同一文件,只要每个线程为此使用其私有文件描述符即可。

  2. 仅执行单个

    open()
    ,然后使用
    pread()
    pwrite()
    进行阅读和写作。由于它们既不访问也不更新查找位置,因此可以在同一文件描述符上的不同线程中安全地使用它们。

当然,在这两种情况下,您都必须确保当一个线程正在写入文件的某个区域时,没有其他线程正在读取同一区域或写入该区域,否则您将面临数据损坏的风险。

© www.soinside.com 2019 - 2024. All rights reserved.