news 2026/3/13 18:32:39

计算机里的“同步”不是“同时”——详解多线程数据混乱之谜

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机里的“同步”不是“同时”——详解多线程数据混乱之谜

各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb

在多线程编程中,我们经常听到“同步”这个词。在现实生活中,比如阅兵方阵,同步意味着“大家一起做动作”(同时性);但在计算机科学中,同步(Synchronization)的意思恰恰相反——它强调的是协同步调,按预定的先后次序运行(顺序性)。

今天我们就来探讨为什么多线程需要同步,以及如果没有同步,世界会乱成什么样。


一、 为什么会发生“数据混乱”?

在多线程环境下,数据混乱(Data Chaos)通常由三个要素共同导致,这也是我们解决问题的根本逻辑:

  1. 资源共享:多个线程访问同一块内存(必要条件)。
  2. 调度随机:操作系统分配 CPU 时间片是随机的,线程随时可能被暂停(不可控)。
  3. 缺乏同步:没有机制来控制访问的顺序(这是唯一我们可以解决的)。

当这三者同时存在时,就会引发与时间有关的错误(Time-related errors)。我们通过两个经典案例来复现这种灾难。


二、 经典案例一:银行取钱问题

1. 场景描述

假设有一个银行账户余额50000 元

  • 丈夫(线程 A):拿着存折去柜台取20000 元。柜台操作慢,查询余额后需要确认签字(模拟耗时)。
  • 妻子(线程 B):拿着银行卡去 ATM 取20000 元。ATM 操作快。

预期结果:50000 - 20000 - 20000 =10000 元

2. 代码复现 (bank_race.c)

为了模拟“调度随机”和操作耗时,我们在读取余额和写入余额之间强制加入usleep,人为制造 CPU 切出的机会。

#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<unistd.h>// 共享资源:银行账户余额intbalance=50000;void*withdraw(void*arg){intamount=(int)(long)arg;intcur_balance;// 1. 读取当前余额 (Load)cur_balance=balance;printf("--- [线程 %lu] 查询余额: %d, 准备取款: %d\n",pthread_self(
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 4:01:53

CosyVoice语音合成:5分钟快速上手多语言语音生成神器

CosyVoice语音合成&#xff1a;5分钟快速上手多语言语音生成神器 【免费下载链接】CosyVoice Multi-lingual large voice generation model, providing inference, training and deployment full-stack ability. 项目地址: https://gitcode.com/gh_mirrors/cos/CosyVoice …

作者头像 李华
网站建设 2026/3/13 8:22:28

区块链数字藏品(NFT)开发公司

找满意的数字藏品&#xff08;NFT&#xff09;开发公司&#xff0c;是一个涉及多方面考量的重要决策。这不仅仅是技术外包&#xff0c;更是将您的品牌理念、艺术愿景和商业模式转化为安全、高效、吸引人的区块链资产的过程。一、确立项目需求与期望在开始寻找任何开发公司之前&…

作者头像 李华
网站建设 2026/3/12 20:11:35

基于单片机的心率与血压监测仪设计(有完整资料)

资料查找方式&#xff1a;特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可编号&#xff1a;T4292305C设计简介&#xff1a;本设计是基于STC89C52的心率与血压监测仪&#xff0c;主要实现以下功能&#xff1a;可通过血压心率模块检测血压与心率 可通…

作者头像 李华
网站建设 2026/3/13 9:55:18

NSTool终极指南:快速掌握Switch文件处理的10个技巧

NSTool终极指南&#xff1a;快速掌握Switch文件处理的10个技巧 【免费下载链接】nstool General purpose read/extract tool for Nintendo Switch file formats. 项目地址: https://gitcode.com/gh_mirrors/ns/nstool NSTool是一个专为Nintendo Switch文件格式设计的通用…

作者头像 李华