UNIT 43 / 78 · W06-2
计数与数据发布需要不同顺序
本单元预计 4 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。
时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。
先知道自己在观察什么
原子操作与 happens-before →
先区分单对象RMW与发布普通payload,画release、读到该值的acquire及join三种边。
先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。
本单元另列的补授
以下时间加在原单元预算之外;完成对应读法后再进入依赖它的任务。
- yield的合同 → · 10min
先留下自己的预测或独立尝试
逐步预测payload=42的发布与读取;运行100次检查,只记录已执行路径。
release/acquire 发布一次普通数据 →源码下载与编译入口
下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →
23-b.cpp先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。
通过一个变动看清原因
在副本将一次性payload改为7,更新正常与失败注入的对应期望,保持发布顺序与守卫。
修改后应观察到什么
消费者每次读到7;没有用第二次普通写偷偷复用同一payload。
换一组条件,独立解决
独立设计一个一次性发布模型:生产者准备两个小整数[3,4]后发布ready,消费者获知后求和;线程结束前不复用存储。
用这些条件检查自己的实现
- 消费者结果7;ready未获取时不访问普通输入。
- 用纸上交错展示原子load+store的丢更新;不运行故意data-race版本。
用证据决定是否进入下一单元
- relaxed计数为什么够用,却不能直接发布旁边的普通数据?
- 任意一次acquire为何不会使所有写入自动可见?
本单元的验收依据
代码、访问者清单与happens-before图对得上;测试通过不等于所有调度或可复用队列已证明。
留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。