发布时间:2026/8/10 10:54:45
Linux--为什么多线程共享全局变量结果错乱?无锁并发的数据竞争深度剖析 为什么多线程共享全局变量结果错乱并发数据竞争深度剖析前言初学多线程时最经典的坑明明设定100张票多窗口并发售卖最后不仅卖出重复票总售票数还远超100张变量数值完全不符合预期。这就是数据竞争竞态条件根源是多线程无保护并发操作临界资源。本文从基础概念、代码复现、底层汇编原理层层拆解错乱原因理清原子操作与线程调度逻辑最后引出解决方案完整串起互斥锁诞生的背景。一、四个核心基础概念通俗释义1. 临界资源多个线程都能读写、共享使用的资源同一时间只允许一个线程操作全局变量、全局数组、打开的文件、共享内存都属于临界资源。售票案例中全局变量 ticket 就是典型临界资源。2. 临界区线程代码里专门用来访问、修改临界资源的代码片段也就是操作共享变量的那几行代码。本例中 if(ticket0) 判断、打印票数、ticket-- 扣减票数整段逻辑都属于临界区。3. 互斥约束规则任意时刻临界区内最多只能有一个线程进入执行一个线程在临界区操作时其余线程全部在外等待以此保护临界资源数据不乱改。4. 原子性操作不可拆分、不可被CPU调度打断只有两种最终状态完整全部执行完毕或是完全没开始执行不存在执行一半暂停的情况。简单举例喝水是原子操作拿起水杯、仰头、放下拆成三步就不是原子操作。二、问题复现无锁多线程售票代码完整源码#includestdio.h#includestdlib.h#includeunistd.h#includepthread.h// 临界资源全局共享票数intticket100;void*route(void*arg){constchar*id(constchar*)arg;while(1){if(ticket0){usleep(1000);// 模拟真实售票业务耗时printf([%s] 售出票%d\n,id,ticket);ticket--;// 核心问题代码}else{break;}}returnNULL;}intmain(void){pthread_tt[4];constchar*ids[]{窗口1,窗口2,窗口3,窗口4};for(inti0;i4;i){pthread_create(t[i],NULL,route,(void*)ids[i]);}for(inti0;i4;i){pthread_join(t[i],NULL);}return0;}编译运行指令gcc test.c-oticket-lpthread./ticket异常现象重复售卖同一张票多个窗口打印相同票号票数最终出现负数总售票数量超过初始100张发生严重超卖每次运行打印顺序、最终票数结果都不一样结果随机难以复现。三、逐层拆解数据错乱两大核心原因原因1ticket-- 并非原子操作底层拆分为三条独立汇编指令C语言看似一行自减代码CPU执行时会拆成三步每一步都可能被线程调度打断Load加载把内存中的 ticket 值读取到CPU寄存器Update运算寄存器内数值减1Store写回将运算后的数值重新写回内存覆盖原值。举极端场景初始 ticket100线程1读取100存入寄存器刚完成加载操作系统切换CPU挂起线程1线程2同样读取内存中100完成三步自减内存票数变为99CPU切回线程1线程1继续执行寄存器里100减1写回内存票数再次变成99两次售票操作票数只减少1直接造成漏扣票数、后续超卖。原因2线程抢占式调度判断与业务延时存在空隙代码里 usleep(1000) 模拟售票等待线程判断 ticket0 进入代码段后进入休眠。此时CPU空闲操作系统会调度其余线程运行多个线程先后判断票数有效全部进入临界区排队等待扣票休眠结束后统一执行 ticket-- 同一票号被多个线程卖出。简单比喻电影院只剩最后一张票四个售票员同时查到有票都收下顾客钱等出票时才发现票早已被别人卖掉出现重复出票。四、竞态条件总结多个线程并发进入临界区执行非原子操作程序最终运行结果依赖操作系统线程调度的先后顺序这种不确定的竞争现象就叫做竞态条件Race Condition也就是我们所说的数据竞争。局部变量存放在线程私有栈空间仅当前线程可访问不存在竞争只有全局变量、堆内存共享数据这类跨线程可见资源才会触发数据竞争。五、数据竞争的解决思路引出互斥量想要彻底杜绝票数错乱必须满足三条约束同一时刻临界区代码只允许一个线程进入执行临界区空闲时等待的线程可正常进入不会无限阻塞线程离开临界区后及时放行等待线程互不干扰。Linux系统提供 **互斥量mutex互斥锁**实现以上规则线程进入临界区前加锁离开临界区后解锁持有锁的线程独占临界资源其余线程加锁时阻塞等待从根源隔绝多线程同时修改共享变量消灭数据竞争。文末小结数据竞争本质共享临界资源 非原子操作 线程抢占调度单行C代码未必是原子操作算术自增、判断赋值都可能拆分多条指令全局变量天然存在线程竞争风险访问时必须划定临界区通过锁机制实现互斥保护本篇为互斥锁前置理论篇下一篇将详解pthread_mutex互斥量完整使用规范与编码避坑。

相关新闻

2026/8/10 10:54:45

RTP技术人周末指南:自动化活动发现与高效社区参与

最近在整理本地技术社区活动时,发现很多开发者朋友,尤其是刚搬到罗利/达勒姆(Raleigh/Durham)三角研究园(RTP)区域的新同事,周末除了宅家写代码,也想探索一下本地的科技氛围和休闲活…

2026/8/10 10:54:45

PTA基础编程题目集 7-23币值转换(C++语言实现)

摘要:本文是PTA编程题"币值转换"的题解,涵盖题目描述、输入输出格式及C语言实现,展示逐位处理数字与单位、处理中文零的财务大写转换算法。题目描述 输入一个整数(位数不超过9位)代表一个人民币值&#xff0…

2026/8/10 10:54:45

如何3步搞定全网资源下载?终极网络资源嗅探工具使用指南

如何3步搞定全网资源下载?终极网络资源嗅探工具使用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否经…

2026/8/10 11:54:48

Transformer线性注意力原理与实战:Linformer与Performer对比解析

如果你正在使用或研究 Transformer 模型,那么“注意力计算太慢、内存占用太高”这个问题,你一定深有感触。尤其是在处理长序列(比如长文档、高分辨率图像、长音频)时,那个 O(n) 的时间和空间复杂度,就像一道…

2026/8/10 11:54:48

最大流算法全解析:从Ford-Fulkerson到Dinic,实战代码与原理详解

目录 引入 Ford-Fulkerson算法 Edmonds-Karp 算法 Dinic算法 最大流最小割定理 练习 摘要:本文系统介绍了最大流算法的核心概念与经典实现。首先通过物流配送网络的实际案例引入流网络模型,阐述容量限制与流量守恒两大基本性质。随后详细解析了三种…

2026/8/10 11:54:48

最小可运行示例:用 curl 与 Python 调通心灵毒鸡汤 API 的完整笔记

从一个空请求体说起 不少内容类接口要求调用方在请求体里塞满业务字段,而心灵毒鸡汤接口是一个另类:它接收一个空的 JSON 对象即可触发随机文案返回。这种设计很适合用来练习最小可运行示例——用最少的代码、最少的参数,验证一条完整的请求链…

2026/8/9 0:01:56

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 5:09:58

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/10 0:04:00

# AI视频生成2026:多模态控制与工程化落地的技术跃迁

## AI视频生成2026:多模态控制与工程化落地的技术跃迁### 背景:从"抽卡"到"导演"的范式转移2024年,Sora的问世让AI视频生成首次进入公众视野,但彼时的技术被开发者戏称为"抽卡"——输入一段Prompt&…

2026/8/10 0:04:00

2026年五大AI编码CLI工具深度横评:从原理到实战选型指南

1. 项目概述:为什么我们需要对比AI编码CLI工具?如果你和我一样,每天有超过一半的时间是在终端里度过的,那么“效率”就是你最核心的追求。从最初的代码补全插件,到集成在IDE里的智能助手,再到如今能直接在命…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/10 11:20:30

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/9 15:24:19

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…