跳到正文

第11章学习笔记:并发程序设计入门

课程笔记

通过逐步可编译的程序掌握并发程序设计入门,从现象走到语言规则、资源状态和工程证据。

关联:章节 第11章 并发程序设计入门

第11章笔记:并发程序设计入门

本章问题

通过逐步可编译的程序掌握并发程序设计入门,从现象走到语言规则、资源状态和工程证据。 七课组成一条从可编译现象到语言规则、对象状态和工程验证的链,不能拆成互不相干的语法点。

七课连接

  • 线程启动与join:规则 join establishes completion;实验任务为写一个能编译运行的最小程序展示“线程启动与join”,记录输入、关键对象状态、输出和编译命令,并用规则 join establishes completion 解释结果;严格边界为不得把“线程启动与join”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《数据竞态与互斥锁》的输入或约束。
  • 数据竞态与互斥锁:规则 unsynchronized conflicting access races;实验任务为写一个能编译运行的最小程序展示“数据竞态与互斥锁”,记录输入、关键对象状态、输出和编译命令,并用规则 unsynchronized conflicting access races 解释结果;严格边界为不得把“数据竞态与互斥锁”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《lock_guard与作用域锁》的输入或约束。
  • lock_guard与作用域锁:规则 RAII releases mutex on every path;实验任务为写一个能编译运行的最小程序展示“lock_guard与作用域锁”,记录输入、关键对象状态、输出和编译命令,并用规则 RAII releases mutex on every path 解释结果;严格边界为不得把“lock_guard与作用域锁”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《条件变量与谓词》的输入或约束。
  • 条件变量与谓词:规则 wait loops on a predicate;实验任务为写一个能编译运行的最小程序展示“条件变量与谓词”,记录输入、关键对象状态、输出和编译命令,并用规则 wait loops on a predicate 解释结果;严格边界为不得把“条件变量与谓词”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《原子操作与内存序入门》的输入或约束。
  • 原子操作与内存序入门:规则 atomic order constrains visibility;实验任务为写一个能编译运行的最小程序展示“原子操作与内存序入门”,记录输入、关键对象状态、输出和编译命令,并用规则 atomic order constrains visibility 解释结果;严格边界为不得把“原子操作与内存序入门”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《任务、future与结果传播》的输入或约束。
  • 任务、future与结果传播:规则 future transports value or exception;实验任务为写一个能编译运行的最小程序展示“任务、future与结果传播”,记录输入、关键对象状态、输出和编译命令,并用规则 future transports value or exception 解释结果;严格边界为不得把“任务、future与结果传播”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《确定性并发模型实验》的输入或约束。
  • 确定性并发模型实验:规则 schedule determines observable trace;实验任务为写一个能编译运行的最小程序展示“确定性并发模型实验”,记录输入、关键对象状态、输出和编译命令,并用规则 schedule determines observable trace 解释结果;严格边界为不得把“确定性并发模型实验”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《接口、实现与目录结构》的输入或约束。

实验闭环

从空目录建立在线兼容的C++17程序,开启警告,运行本章两道代码题各四组测试,再新增一个失败用例。C++20扩展另作显式比较。保存编译命令、输入、输出、首个诊断和修复后的回归。涉及资源就画所有权,涉及容器就标迭代器有效性,涉及并发就画happens-before。

复盘

错题不能只记“粗心”。标记它属于阶段、类型、控制、对象生存期、所有权、异常、复杂度还是并发。更换输入与实现重做阶段卷;能解释规则为何阻止错误,并能展示反例,才算迁移成功。