← 完整学习路线

UNIT 42 / 78 · W06-1

先定义关闭,再写等待

本单元预计 4 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。

时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。

01 / READ

先知道自己在观察什么

条件变量、有界队列与关闭协议 →

分别列出空、满、关闭且有数据、关闭且空四种状态,再读两个谓词与 close-before-join。

先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。

本单元另列的补授

以下时间加在原单元预算之外;完成对应读法后再进入依赖它的任务。

02 / PREDICT & RUN

先留下自己的预测或独立尝试

先画容量3传递1到100与排空退出;运行确认5050并检查已有的生产失败清理测试。

容量三的生产者消费者队列 →
源码下载与编译入口

下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →

22-a.cpp

先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。

03 / CHANGE ONE THING

通过一个变动看清原因

把副本正常输入范围改成1到10,并同步更新对应和的检查;关闭、拒绝push和异常注入仍保留。

修改后应观察到什么

正常累加55;失败注入时等待消费者仍能退出且和为零。

04 / DO IT YOURSELF

换一组条件,独立解决

独立写队列状态表与四个关闭测试:空关闭、有数据后关闭、满队列上生产者被关闭唤醒、重复关闭。

用这些条件检查自己的实现

  • 空关闭的pop结束;有数据关闭仍排空后结束。
  • 关闭后push失败;满队列等待者被唤醒,不用sleep猜调度。
05 / EXPLAIN & CHECK

用证据决定是否进入下一单元

  1. 通知和持久状态为什么不能互相替代?
  2. 为什么只换可自动join线程仍可能在关闭路径死锁?

本单元的验收依据

四种状态的预期与实际检查一致,能为每个等待者指出唤醒来源和退出谓词。

留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。