第4章学习笔记:同步、互斥与竞态推演
课程笔记从不可分割状态迁移理解锁、信号量、条件变量与无锁边界。
关联:章节 第4章 同步、互斥与竞态推演
第4章笔记:同步、互斥与竞态推演
本章问题
从不可分割状态迁移理解锁、信号量、条件变量与无锁边界。 本章不是七个术语的并列清单,而是一条从可观察现象到内部状态、从内部状态到工程证据的因果链。学习时始终标出对象身份、队列或表项、触发事件、权限边界和不可破坏的不变量。
七节机制连接
- 竞态不是同时运行的同义词:当结果依赖未受约束的事件交错且至少一个操作写共享状态时形成数据竞态或更广义逻辑竞态;实验入口为把counter++拆成读、加、写,让两线程交错得到丢失更新,再用串行执行反查;反查边界是线程并发不必然错误;即使无数据竞态,也可能有检查后使用的逻辑竞态。
- 临界区与正确性条件:互斥、进展和有限等待共同描述临界区协议,入口和退出必须对所有路径成对;实验入口为为两个线程列出Peterson算法共享变量的读写顺序,验证假设成立时不会同时进入;反查边界是经典软件算法依赖内存模型与原子读写假设,不能直接替代现代语言同步原语。
- 锁、原子操作与内存可见性:互斥锁提供所有权和happens-before关系,原子读改写保证单变量操作不可分割;实验入口为比较普通计数、mutex计数与atomic计数,记录正确性、争用和扩展曲线;反查边界是原子变量只保护自身,不自动维持多个变量之间的不变量;忙等也会消耗CPU。
- 信号量的资源语义:计数信号量表示可用许可,wait原子地消耗许可或阻塞,post归还并唤醒等待者;实验入口为用empty、full、mutex三信号量推演容量3的生产者消费者队列;反查边界是信号量初值和每条路径的P/V次序决定安全;多post或漏post都会破坏许可守恒。
- 条件变量与管程:条件变量让线程在持锁检查谓词后原子释放锁并等待,唤醒后必须循环重查谓词;实验入口为为有界队列写while not_full wait与while not_empty wait,模拟虚假唤醒和多个等待者;反查边界是if代替while会在竞争或虚假唤醒后越界;通知不是把条件本身永久记住。
- 实验:信号量许可守恒:离散模拟器记录每次P/V后的许可与阻塞数,用不变量检测负许可或资源泄漏;实验入口为输入初值与P/V事件序列,输出完成操作数、阻塞数和最终许可;反查边界是模拟策略必须声明阻塞P是否排队以及后续V是否直接转交许可。
- 实验:交错枚举找丢失更新:系统化测试枚举两线程读改写步骤的所有保持程序序的交错,收集可能终值;实验入口为对两个counter++各拆三步,程序输出全部可能结果和产生错误结果的交错数;反查边界是枚举只能覆盖有限模型;现实编译器与弱内存还会引入额外重排,需要同步语义约束。
请给七节画依赖箭头:前一节留下的状态或接口怎样成为下一节输入?每条箭头补单位、事件或保护条件。若任何一节可以随意搬走且不影响上下文,说明你还没有建立章内联系。
章内实验
选择本章至少一个代码实验,从空环境运行全部内联测试,再新增一个资源耗尽、非法迁移、同刻事件或崩溃输入。保存输入、输出、参考模型、首个偏差和修复后的回归证据。不可复现的睡眠竞态或人工截图不算实验结果。
错题闭环
把错误编码为对象混淆、状态跳步、单位错误、队列顺序、竞态遗漏、权限越界或恢复假设。不要只写粗心。一周后更换数字和事件顺序重做阶段卷;能在新输入下重建机制而非记住答案,才算迁移成功。