news 2026/4/29 1:07:40

c++怎么在Linux下利用pread函数实现线程安全的文件读取【进阶】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++怎么在Linux下利用pread函数实现线程安全的文件读取【进阶】

pread线程安全但需独立缓冲区、确定offset、检查返回值及errno;64位offset需编译宏或pread64;小块随机读用pread,高频连续读宜用mmap。pread 本身线程安全,但文件偏移和缓冲区共享会破坏它pread 确实不修改文件描述符的当前偏移(lseek 不影响它),调用之间互不干扰——这是它比 read 更适合多线程的关键。但很多人一上手就错在:用同一个 char* 缓冲区被多个线程同时写入,或者把 offset 算错了(比如基于共享变量递增,没加锁)。结果不是数据错位,就是读到一半被覆盖。实操建议:立即学习“C++免费学习笔记(深入)”;每个线程必须使用**独立分配的缓冲区**,别共用全局 buffer 或栈上同一块内存offset 值要由调用方完全确定,不能依赖 lseek(fd, 0, SEEK_CUR) 或其他可能被并发干扰的状态如果 offset 来自某个“任务队列”,确保队列分发逻辑是线程安全的(比如用 std::queue + std::mutex,或无锁结构)不要在 pread 前后对同一 fd 调用 lseek、write、truncate 等可能改变文件状态的操作——虽然 pread 不改偏移,但这些操作会影响其他线程对文件长度/内容的预期pread 返回值和 errno 必须每次都检查,尤其 EINTR 和 EINVALLinux 下 pread 可能因信号中断返回 -1 并置 errno = EINTR,也常因传入负 offset 或超出文件大小返回 EINVAL。不检查就直接 memcpy,轻则读到垃圾数据,重则 core dump。实操建议:立即学习“C++免费学习笔记(深入)”;永远用 ssize_t n = pread(fd, buf, count, offset); 接收返回值,别用 int检查 n == -1 后,立刻判断 errno:if (errno == EINTR) continue;(重试),else if (errno == EINVAL) 就该打日志并跳过该 offset注意 n == 0 表示已到 EOF(哪怕 offset 在文件末尾),不是错误;但 n > 0 才表示成功读取了对应字节数别假设 count 一定能读满——即使 offset 合法且文件足够长,内核也可能只返回部分数据(比如磁盘 I/O 暂时受限)64 位 offset 需要 __off64_t 和 pread64,glibc 版本和编译选项有坑Linux 默认 pread 的 off_t 是 32 位(在某些旧系统或未定义宏的编译环境下),超过 2GB 的文件 offset 会被截断。直接传一个 uint64_t offset = 0x100000000ULL,进去就变 0,读的全是开头。 文小言 百度旗下新搜索智能助手,有问题,问小言。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 1:07:40

常用数据结构特点对比

常用数据结构特点对比数据结构底层实现核心特点典型场景数组 (Array)连续内存空间固定大小,随机访问快(O(1)),插入/删除需移动元素(O(n))存储固定长度数据、快速查询场景List接口(无具体实现&am…

作者头像 李华
网站建设 2026/4/29 1:06:42

AI入门必看|从0到1打通知识点

前言:如今AI已经渗透到开发、工作的每一个角落——写代码有Copilot,做图像处理有OpenCV,聊天有大语言模型,甚至部署项目也能靠AI优化。但很多新手面对“机器学习”“深度学习”“Transformer”这些名词时,总会陷入困惑…

作者头像 李华
网站建设 2026/4/29 1:06:28

2026届最火的降重复率神器推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 让AIGC检测率降低的关键之处在于去模拟人类写作所具备的自然特性,首先&#xff0…

作者头像 李华
网站建设 2026/4/29 0:55:03

Win10BloatRemover:让你的Windows 10重获极速与隐私

Win10BloatRemover:让你的Windows 10重获极速与隐私 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on the W10 de…

作者头像 李华
网站建设 2026/4/29 0:53:59

如何快速激活Windows系统?KMS_VL_ALL_AIO智能激活脚本终极指南

如何快速激活Windows系统?KMS_VL_ALL_AIO智能激活脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?KMS_VL_ALL_AIO是一款基于…

作者头像 李华
网站建设 2026/4/29 0:51:30

【20年架构师总结】Kubernetes 中的 Calico网络【20260428-001篇】

文章目录 🌐 一、Calico 核心理论:不是“又一个 CNI”,而是「网络即策略」的云原生操作系统 🔑 本质定位(来自官方定义 & 高庆原文) ⚙️ 核心组件(逐个拆解,源自高庆原文) 🚀 二、实战分层:入门 → 进阶 → 高级 → SRE/DevOps/AIOps 🟢 入门:5 分钟跑通…

作者头像 李华