相关:多线程读取同一文件
mmap 可用于读写文件,但不支持大文件,例如在 32 位系统上。
C 中的 stdio FILE* 或 Linux 文件句柄,另一方面,可以处理大文件,只不过它们在文件内有一个通过
ftell
获得的位置。这意味着,即使对于读取操作,我们也不能在多个线程中使用相同的文件处理程序(没有锁)。如果创建多个句柄,则写入可能无法安全地并行进行。
是否有一个好方法来克服上述两种方法的缺点,让多个线程并行访问大文件(在不相交的块上写入)?
当然,有时候不使用锁是不可能的。但理想情况下,在存储设备支持并行访问的情况下,最好有一种从存储设备读取数据而无需不必要的锁的方法。
有两种可能:
为每个线程打开一次文件,通过
fopen()
获取 FILE*
或通过 open()
获取文件描述符。然后,每个线程都可以安全地并行读取和写入同一文件,只要每个线程为此使用其私有文件描述符即可。
仅执行单个
open()
,然后使用pread()
和pwrite()
进行阅读和写作。由于它们既不访问也不更新查找位置,因此可以在同一文件描述符上的不同线程中安全地使用它们。
当然,在这两种情况下,您都必须确保当一个线程正在写入文件的某个区域时,没有其他线程正在读取同一区域或写入该区域,否则您将面临数据损坏的风险。