飞豹客 · 课能看,资料也能带走
飞豹客后端开发 会员免费

硬件内存模型和CC++内存模型

先搞清楚:这门课不是教你怎么写业务代码 很多人写多线程程序,靠的是「加锁就完事了」的直觉:程序跑出诡异结果就多套一层锁,偶尔不复现就当没事。这门课针对的正是这种状态——它讲的是内存模型,也就是编译器和 CPU 在你不知道的情况下,到底对你的读写指令做了什么重排,以及 C 和 C++ 各自给出了什么规

单课价¥19.90新品 上架
会员价 会员免费开通会员后本篇可直接下载套餐详情
173 人关注 更新于 2026-09-21 永久有效
发货

网盘链接 · 支付成功后自动发货

保障

永久有效 · 链接失效免费补发

客服

每日 9:00-21:00 在线客服 联系客服

会员可免费下载本篇月会员、年会员、永久会员可免费领取。

开通会员 ›
购买本课销量 0 · 永久有效
会员价 · 单课标价 ¥19.90

会员 · 按档位

永久免费可领
年免费可领
月免费可领

游客按标价购买,不享受上表折扣。

支付成功后自动发放网盘链接,链接失效可找客服免费补

正版保障 极速发货 售后无忧

先搞清楚:这门课不是教你怎么写业务代码

很多人写多线程程序,靠的是「加锁就完事了」的直觉:程序跑出诡异结果就多套一层锁,偶尔不复现就当没事。这门课针对的正是这种状态——它讲的是内存模型,也就是编译器和 CPU 在你不知道的情况下,到底对你的读写指令做了什么重排,以及 C 和 C++ 各自给出了什么规则来约束这些行为。学完之后,你看待数据竞争、原子操作、内存序这些问题,会从「背结论」变成「知道为什么」。

它解决的场景很具体:多线程共享数据时结果不稳定、加锁后性能掉得厉害想换成原子变量、看别人代码里的 memory_order 参数看不懂、被面试问到内存屏障答不上来。如果你只写单线程逻辑,或者日常用高层并发库且从不深究,这门课对你的即时收益有限。

适合什么基础,不建议谁直接上手

需要的前提不算低:能读懂 C 语言的基本语法,知道指针和内存地址是怎么回事,最好亲手写过带 pthread 或 std::thread 的多线程代码,哪怕只是跑出过错误结果。课程前段专门安排了进程与线程的区分、C 语言标准库建线程、并行与并发的差别,这部分对基础薄弱的人算是补课,但节奏不会拖太久。

如果你完全没接触过线程、也没写过 C,建议先补一段基础的多线程练习再回来,否则后面的数据竞争分析和内存序讨论会变成纯听讲。反过来,如果你已经在用 C++ 的 atomic 写代码,但说不清 relaxed 和 acquire-release 的区别,这门课正好补上那块缺口。

建议的观看顺序和练习方式

按资料的组织顺序走即可,但重点要放在中后段。开头的内容说明和进程线程部分可以快速过,重点确认自己对并发和并行的理解没有偏差。真正要慢下来的是数据竞争部分:先看多线程竞争的例子,自己动手复现一遍,再对照讲解分析竞争是怎么产生的,这一步别只看不写。

练习建议这样配合:每看完一个竞争场景,自己写一份最小可复现的代码,分别用加锁、原子变量两种方式改一遍,比较行为和性能差异。内存模型的理论部分光看容易忘,配合实际代码观察编译器优化前后的差异,理解会扎实很多。整个资料以讲解视频为主,没有配套作业,所以练习量完全靠自己补,这一点要有心理准备。

学完能独立做到的事:判断一段多线程代码是否存在数据竞争、为共享数据选择合适的同步方式而不是无脑加锁、读懂并使用 C++ 原子操作的内存序参数、在排查偶发并发问题时知道往哪个方向查。这些能力在后台服务、基础组件、性能敏感模块的开发里都用得上,但它不会直接教你写某个框架,落地还要结合你自己的项目。

课程目录

课程目录88 集
  • 课程介绍 [C++]硬件内存模型和CC++内存模型 属于后端开发 / itjc8方向的教程资源,围绕 C++ 相关内容整理。 内容涵盖:{1}、课程内容及相关说明、{2}、进程和线程、认识进程和线程、C语言对线程的支持 等主题。 适合希望系统学习 C++ 、需要完整资料对照的同学。 下方为完整资料与目录,可先看目录判断是否符合需要。 ├─{1}--课程内容及相关说明 │ [1.1]--课程内容及相关说明.mp4
  • │ ├─{2}--进程和线程 │ [2.1]--认识进程和线程.mp4
  • │ [2.2]--C语言对线程的支持.mp4
  • │ [2.3]--C语言编译器的选择.mp4
  • │ [2.4]--用C标准库函数创建线程.mp4
  • │ [2.5]--并行和并发.mp4
  • │ ├─{3}--数据竞争 │ [3.1]--多线程数据竞争的例子.mp4
  • │ [3.2]--数据竞争是如何产生的.mp4
  • │ ├─{4}--原子操作和锁 │ [4.1]--原子操作和原子变量.mp4
  • │ [4.2]--互斥锁.mp4
  • │ [4.3]--执行原子操作的机器指令.mp4
  • │ [4.4]--用机器指令实现原子操作的例子.mp4
  • │ [4.5]--用机器指令实现互斥锁的例子.mp4
  • │ ├─{5}--线程通信及相关问题 │ [5.1]--一个线程间通信的例子.mp4
  • │ [5.2]--编译优化和指令重排.mp4
  • │ [5.3]--原子操作的神奇效应.mp4
  • │ ├─{6}--流水线、乱序执行和缓存 │ 000.夸克手机注册领取1TB方法.png │ [6.1]--什么是编排顺序.mp4
  • │ [6.2]--流水线.mp4
  • │ [6.3]--乱序执行.mp4
  • │ [6.4]--指令的执行和引退.mp4
  • │ [6.5]--存写缓冲器.mp4
  • │ [6.6]--缓存.mp4
  • │ ├─{7}--硬件内存模型 │ [7.1]--多处理器系统和顺序一致性.mp4
  • │ [7.2]--顺序一致的执行.mp4
  • │ [7.3]--特别练习7.mp4
  • │ [7.4]--顺序一致性模型的访存次序.mp4
  • │ [7.5]--偏序和全序.mp4
  • │ [7.6]--顺序一致性存在单一全序.mp4
  • │ [7.7]--x86处理器的指令重排.mp4
  • │ [7.8]--x86处理器上的存全序TSO.mp4
  • │ [7.9]--x86的内存屏障指令MFENCE.mp4
  • │ [7.10]--x86-tso的访存次序(一).mp4
  • │ [7.11]--x86-tso的访存次序(二).mp4
  • │ [7.12]--x86-tso的访存次序(三).mp4
  • │ [7.13]--x86-tso的访存次序(四).mp4
  • │ [7.14]--x86-tso的访存次序(五).mp4
  • │ [7.15]--x86-tso的访存次序(六).mp4
  • │ [7.16]--x86访存次序的总结.mp4
  • │ [7.17]--多处理器和缓存一致性.mp4
  • │ [7.18]--MESI协议.mp4
  • │ [7.19]--MESI协议的状态转化.mp4
  • │ [7.20]--arm/power的访存次序(一).mp4
  • │ [7.21]--arm/power的访存次序(二).mp4
  • │ [7.22]--arm/power的访存次序(三).mp4
  • │ [7.23]--arm/power的访存次序(四).mp4
  • │ [7.24]--如何阻止指令重排.mp4
  • │ [7.25]--避免数据竞争的顺序一致性.mp4
  • │ [7.26]--x86平台上的同步操作指令.mp4
  • │ [7.27]--SC-DRF的实例.mp4
  • │ [7.28]--特别练习7-2.mp4
  • │ └─{8}--C/C++内存模型 [8.1]--C/C++内存模型简介.mp4
  • [8.2]--C语言的表达式.mp4
  • [8.3]--表达式的例子.mp4
  • [8.4]--表达式的功能.mp4
  • [8.5]--求值、值计算和副作用.mp4
  • [8.6]--前序、后序和序列点.mp4
  • [8.7]--特别练习8.mp4
  • [8.8]--无序和不确定顺序.mp4
  • [8.9]--冲突和数据竞争.mp4
  • [8.10]--原子操作库.mp4
  • [8.11]--一个多线程数据竞争的例子.mp4
  • [8.12]--用原子操作解决数据竞争的例子.mp4
  • [8.13]--C/C++内存模型的核心思想.mp4
  • [8.14]--原子操作的附加属性(同步和访存次序).mp4
  • [8.15]--通过原子操作施加指定的访存次序.mp4
  • [8.16]--通过原子操作施加内存同步.mp4
  • [8.17]--前发.mp4
  • [8.18]--同步操作及其分类.mp4
  • [8.19]--原子操作的线程间同步.mp4
  • [8.20]--依赖前序.mp4
  • [8.21]--线程间前发.mp4
  • [8.22]--可见副作用.mp4
  • [8.23]--再论前序和前发.mp4
  • [8.24]--松散的原子操作.mp4
  • [8.25]--原子变量的修改次序.mp4
  • [8.26]--原子操作的一致性规则.mp4
  • [8.27]--顺序一致性的原子操作.mp4
  • [8.28]--实例解析一.mp4
  • [8.29]--实例解析二.mp4
  • [8.30]--实例解析三.mp4
  • [8.31]--实例解析四.mp4
  • [8.32]--实例解析五.mp4
  • [8.33]--实例解析六.mp4
  • [8.34]--对原子操作函数的附加说明.mp4
  • [8.35]--C语言对原子类型的支持:存取的顺序一致性语义.mp4
  • [8.36]--C语言对原子类型的支持:复合赋值的顺序一致性语义.mp4
  • [8.37]--C语言对原子类型的支持:递增和递减的顺序一致性语义.mp4
  • [8.38]--C语言对原子类型的支持:不使用标准库函数的线程同步.mp4