You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用mmap时,如何通过多线程安全并行读写大文件?

大文件多线程并行访问的无锁解决方案

针对大文件的多线程并行访问(写入操作仅针对不重叠块),可以通过以下几种方式避开mmap和标准文件句柄的弊端,尽量实现无锁并行:

一、用文件描述符配合pread()/pwrite()直接操作

  • 放弃FILE*依赖的内部位置指针,改用原始Linux文件描述符,搭配pread()和pwrite()系统调用。这两个函数的核心优势是显式指定读写偏移量,完全不依赖文件描述符的当前位置:
    • 读操作:pread(fd, buf, count, offset),直接从offset位置读取count字节,不修改文件描述符的位置
    • 写操作:pwrite(fd, buf, count, offset),直接把buf内容写入offset位置,同样不改变当前位置
  • 多个线程可以共用同一个文件描述符,只要读写的块完全不重叠,就不需要任何锁——因为每个操作的目标位置都是独立指定的,没有共享的状态需要维护。这种方式完美支持大文件,32位系统下用off64_t类型的偏移量就能处理超大文件。

二、为每个线程分配独立的文件描述符

  • 如果业务场景需要用到FILE*或者独立的文件状态,可以给每个线程单独打开目标文件,让每个线程持有自己的文件描述符或FILE指针。
  • 操作注意:
    • 读操作:每个线程的位置指针独立,各自处理自己负责的文件块,无需加锁
    • 写操作:必须严格保证所有线程写入的块无重叠,否则会出现数据覆盖;这种方式不适合追加写,但固定偏移的非重叠块写入是安全的
  • 缺点:会占用更多系统文件句柄资源,但只要线程数在合理范围,这个代价完全可控。

三、32位系统下的mmap分段映射

  • 如果偏好内存映射的访问方式,在32位系统可以对大文件做分段映射:每次只映射文件的一块(比如256MB),处理完成后释放映射,再映射下一块。
  • 多线程可以各自映射不同的文件块,只要块不重叠,读写操作都不需要锁,既保留了mmap的便捷性,又避开了32位地址空间的限制。

内容的提问来源于stack exchange,提问作者Mr User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:10