共享内存 多进程并发竞争:非原子操作引发数据丢失

发布时间:2026/11/5 9:52:55

共享内存 多进程并发竞争:非原子操作引发数据丢失 一、基础概念1. 共享内存共享内存是 Linux 常用 IPC 通信方式由内核开辟一块独立物理内存允许多个进程同时映射、读写同一份数据是多进程数据共享的核心方案。2. 非原子操作与竞态条件原子操作一次性执行完成中途不可被系统打断。自增 不是原子操作底层拆分为三步独立 CPU 指令1. 读从内存读取数值到寄存器 2. 改寄存器数值 1 3. 写新值写回内存系统可在三步之间切换进程多进程并行操作会出现指令交错、数据覆盖产生竞态条件最终导致数据丢失。二、完整代码小白友好注释#include sys/shm.h #include sys/ipc.h #include stdio.h #include unistd.h #include sys/wait.h // 用于生成唯一IPC键值 #define SHARE_PATH /home/china #define PROJ_ID 251 int main() { // 1. 生成IPC唯一键值 key_t key ftok(SHARE_PATH, PROJ_ID); if (key -1) { perror(ftok); return -1; } // 2. 创建1000字节共享内存 int shmid shmget(key, 1000, IPC_CREAT | 0666); if (shmid -1) { perror(shmget); return -1; } // 3. 映射共享内存到当前进程虚拟空间 int *p (int *)shmat(shmid, NULL, 0); if (p (void *)-1) { perror(shmat); return -1; } *p 0; // 初始化共享计数器 // 4. 创建父子进程并发执行 pid_t pid fork(); if (pid 0) { // 子进程自增100万次 int i 0; while (i 1000000) (*p); } else if (pid 0) { // 父进程自增100万次 int i 0; while (i 1000000) (*p); wait(NULL); // 等待子进程结束 printf(最终计数 data %d\n, *p); } shmdt(p); // 解除映射 shmctl(shmid, IPC_RMID, NULL); // 主动销毁共享内存避免内核残留 return 0; }三、运行效果理论值2000000父子各累加100万次实际值随机数值始终小于 2000000现象并发无同步保护出现大量计数丢失。四、原理详解1. 为什么会丢数据自增操作分三步系统可以随时切进程导致两个进程读到同一个旧值父进程读取数值 100还没写回被系统暂停子进程同样读取到旧值 100子进程算 1001101写回内存切回父进程父进程也算出 101再次覆盖写回。结果父进程两次自增只加了1次数据丢失一次。循环一百万次这种覆盖反复发生最终数值远远小于理论值。同步锁的作用保证「读-改-写」三步一次性做完中途不允许其他进程插队。补充循环设为 100 万而非 10 万延长运行时间提升进程切换概率更容易复现数据丢失。如果只循环 10 万次程序运行太快系统来不及切换进程大概率看不到丢数现象2. 为什么不用全局变量fork 后父子进程虚拟地址空间相互独立内核采用写时拷贝 COW机制初始父子共享同一块物理内存一旦任意进程修改全局变量内核会为该进程复制一份全新物理内存。修改后父子数据彻底隔离无法共享计数因此必须使用共享内存。五、总结1. 普通全局变量受 COW 机制隔离多进程共享数据只能使用共享内存2.是非原子操作读改写拆分是并发数据丢失的根本原因3. 多进程并发写共享资源必须加同步机制互斥锁/信号量保护临界区4. 程序结束需调用shmctl(IPC_RMID)主动释放共享内存资源。六、运行须知1. 提前执行mkdir /home/china防止 ftok 报错2. 异常退出可手动清理残留ipcs -m查看、ipcrm -m 编号删除。
延伸阅读

更多相关文章

2026/11/4 6:11:31

微服务与领域驱动设计:构建高内聚低耦合系统的指南

目录 一、微服务架构模型的对比与选择 (一)整洁架构 (二)六边形架构 (三)DDD 分层架构 1.用户接口层 2.应用层 3.领域层 4.基础层 5.从三层架构向 DDD 分层架构演进 (四)三种微服务架构模型的对比和分析 二、领域驱动设计分层架构与微服务代码模型 (一)代…

2026/11/5 3:05:19

AI生成结果可靠性验证:测试用例设计与验证点构建全指南

我们组上个月接了一个客服知识问答AI的验收测试,需求方一开始给的验收标准只有一句话:“回答要准确、不能乱说”。这句话让整个测试组头疼了两周——准确怎么定义?乱说怎么判断?同一个问题今天答对明天答错算不算bug?更…

2026/10/24 12:57:31

前置机数据同步用哪种方案?实时比对和定时补偿

前置机数据同步最麻烦的地方在于,链路监控全是绿的,业务侧却时不时冒出一条旧数据。系统替代那段时间,内外网两边的库并行跑,每天早上对账脚本跑出来的差异少则几十条,多的时候上千条,追查下去无非两类原因…

2026/11/5 9:48:36

【亲测免费】 CodiumAI PR-Agent:重塑代码审查的未来

CodiumAI PR-Agent:重塑代码审查的未来 【免费下载链接】pr-agent 🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier. 项目地址: https://gitcode.com/GitHub_Trending/pr/pr-agent 随着软件开发日新…

2026/11/5 9:48:36

【亲测免费】 Distil-Whisper: distil-large-v2的安装与使用教程

Distil-Whisper: distil-large-v2的安装与使用教程 【免费下载链接】distil-large-v2 项目地址: https://ai.gitcode.com/hf_mirrors/distil-whisper/distil-large-v2 引言 随着语音识别技术在各个领域的广泛应用,高效、准确的语音识别模型成为了研究人员和…

2026/11/5 9:48:36

提升PR效率10倍:CodiumAI PR-Agent代码建议功能深度剖析

提升PR效率10倍:CodiumAI PR-Agent代码建议功能深度剖析 【免费下载链接】pr-agent 🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier. 项目地址: https://gitcode.com/GitHub_Trending/pr/pr-agent …

2026/11/5 9:43:35

HVAC温度采集实战:ADS122U04+PIC18LF47K42完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 9:43:35

UART接口24位ADC在工业温度采集中的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑