UNIT 47 / 78 · W06-5
用固定分区验证主项目线程生命周期
本单元预计 6 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。
时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。
先知道自己在观察什么
线程、互斥锁与死锁 →
把逐次共享累加改成局部累加后一次合并,明确最后一次读取与join。
条件变量、有界队列与关闭协议 →
复盘关闭在join之前的原因,队列只作为短练习。
原子操作与 happens-before →
对照原子计数与发布,不为求和强行引入更弱顺序。
TCP 字节流、分包、超时与背压 →
读完整loopback代码时按fd建立、连接完成、发送偏移、读取EOF四段标注。
先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。
先留下自己的预测或独立尝试
先解释自转账与双向转账保持的总额,再运行;不把余额快照拆成两次无关读取。
双向转账保持总额 →源码下载与编译入口
下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →
21-b.cpp先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。
通过一个变动看清原因
在副本增加自转账用例并记录前后两余额,保留双向正常与创建失败回归。
修改后应观察到什么
自转账不改变任何余额,总额仍4000;无重复获取同一非递归mutex。
换一组条件,独立解决
在同一Reduction Lab学习目录建立固定8项、2个任务的受控原型:显式范围[0,4)、[4,8),各写独立partial,join后合并;通用分区留到下一周。
用这些条件检查自己的实现
- 输入1到8得到局部10、26,总和36;全零输入结果0。
- 所有partial预先存在,借用数据活到join后;未通过通用worker测试前不宣布并行接口完成。
用证据决定是否进入下一单元
- 为什么局部结果槽位不同仍需等待线程完成后读取?
- 若创建第二个线程失败,哪个对象负责等第一个?
本单元的验收依据
固定分区原型与生命周期图通过,保留未完成的通用分区任务;同一主项目继续,队列/TCP不扩成额外项目。
留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。