C语言多线程遍历目录批量重命名文件的实现疑问
关于多线程批量重命名文件的方案答疑
先全量遍历收集路径再分组多线程处理的方案可行性
这个方案完全适配你的需求,落地门槛很低:
- 你不需要处理多线程同时遍历目录的资源竞争问题,单线程遍历完所有文件路径后均匀拆分到4组即可,逻辑简单不容易出bug
- 预先全量收集还可以提前做校验,比如过滤掉目录、权限不足的文件,避免工作线程做无效判断
全量收集是否会比单线程边遍历边处理效率更低
绝大多数场景下不会,反而会有明显的效率提升,只有文件总数不足百个的极端场景下,多线程的创建调度开销才会超过收益:
重命名是典型的文件系统元数据操作,IO等待占比极高,单线程边遍历边处理时,CPU大部分时间都处于空等IO返回的状态,多线程可以并行利用IO等待时间处理其他文件,这部分收益远高于预先收集文件路径的开销
落地实现注意事项
- 遍历文件树时做好类型判断,只收集普通文件的路径,不要把目录路径传入
rename_file,避免触发错误 - 路径分组时尽量打散同目录的文件,避免同一目录下的文件都分配到同一个线程,减少单目录操作的锁竞争开销
- 做好错误记录,把
rename_file返回0(执行失败)、-1(出现错误)对应的文件路径统一存储,全部处理完成后输出便于排查问题 - 如果需要处理百万级以上的超大文件量,可以改成生产者-消费者模型:1个线程专门遍历目录,把路径实时写入线程安全队列,4个工作线程直接从队列取路径处理,不需要等全量遍历完成就可以启动重命名,进一步压缩总耗时
内容的提问来源于stack exchange,提问作者mov eax
相关产品推荐
相关产品推荐

