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

C语言中pwrite能否用于多线程并行写入同一文件的不同偏移位置

结论

pwrite是线程安全的系统调用,只要多线程写入的文件偏移区间不存在重叠,写入内容就不会互相干扰,这种用法本身是合法的。

你测试没有看到多线程性能提升,主要有以下几个核心原因:

  • 计时方式错误:你使用的clock()函数统计的是进程消耗的总CPU时间,而非真实的物理流逝时间(墙上时间)。多线程场景下,多个核心的CPU时间会被叠加统计,因此你看到的总耗时不会下降,甚至会比单线程更高。要正确统计耗时,需要使用clock_gettime(CLOCK_MONOTONIC, ...)这类接口统计真实物理时间。
  • 存储带宽瓶颈:你的测试场景总写入量仅150MB,不管是HDD还是SSD,顺序写入带宽通常都远高于这个量级,性能瓶颈根本不在CPU侧,多线程带来的CPU并行收益完全体现不出来。如果是HDD存储,多线程并发写反而会导致磁头频繁寻道,大幅降低实际写入效率。
  • 页缓存干扰:默认情况下Linux的文件写入会先写到内核页缓存中,由后台线程异步刷盘,你统计的耗时其实只是把用户态数据拷贝到内核缓存的时间,这个操作本身就是内存拷贝速度,已经接近极限,多线程调度反而会引入额外开销。如果要测试真实磁盘写入性能,需要在open时添加O_DIRECT标记绕过页缓存,或者写入完成后调用fsync等待所有数据刷盘完成再结束计时。
  • 文件动态扩容锁竞争:如果测试文件没有提前预分配空间,写入过程中操作系统需要动态为文件分配数据块、更新元数据,这个过程内核会持有全局锁,多线程写入会被锁串行化,完全无法体现并行优势。你可以提前用fallocate系统调用把文件所需的空间预分配好,再执行多线程写入测试。
  • 测试数据量过小:150MB的写入量本身耗时极短,多线程创建、调度的开销占比很高,也会覆盖掉并行带来的收益,你可以把总写入量提升到数GB级别,再对比性能差异。

内容的提问来源于stack exchange,提问作者H.Potter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:09:04