AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
临界区 — 我们保护什么以及在哪里保护
C++ SELF
等级 69,
课时 0
解析如何在多线程 C++ 中找到临界区的边界:先确定共享资源及其不变量,然后再考虑锁(例如
std::mutex
)。通过示例展示为什么
++
不是“一个操作”,为什么读取(
size()
、
empty()
、
average()
)也参与竞争,以及如何在
TaskStats
组件中协调保护相关状态(
push_back
+
+=
)。
std::mutex
+
std::lock_guard
— RAII 锁定
C++ SELF
等级 69,
课时 1
解析 C++ 中的基本同步:为什么需要
std::mutex
,为什么手动的
lock()
/
unlock()
容易导致“永远”锁住,以及通过
std::lock_guard
的 RAII 方法如何将互斥量的释放绑定到作用域。演示如何正确限制临界区,保护共享计数器甚至
std::cout
的输出,并分析在使用锁时的常见错误。
std::unique_lock 和 std::scoped_lock — 什么时候需要
C++ SELF
等级 69,
课时 2
解析为什么在多线程 C++ 中有时单纯使用
std::lock_guard
不够:
std::unique_lock
如何帮助精确控制互斥量的持有时间(提前
unlock()
、再次
lock()
、通过
std::defer_lock
延迟获取),以及
std::scoped_lock
如何以一个逻辑操作安全地一次性拿住多个互斥量(例如在账户间转账时)。另外 — 实战模式 “snapshot → compute → commit”、一个简要的选择表和典型错误。
死锁:原因与预防原则
C++ SELF
等级 69,
课时 3
我们来讲解在多线程 C++ 中什么是互相阻塞(
deadlock
):它如何因为不同的
std::mutex
获取顺序而产生,为什么通过无限的
join()
表现为程序“挂起”,以及如何通过锁纪律来预防问题——采用统一的
lock ordering
或使用一次性原子获取多个互斥量的方式(例如
std::scoped_lock
)。另外还讨论在持锁期间做副作用(例如日志记录)的风险,以及“在锁下快照 → 解锁后处理”的实践。
封装同步: “mutex 在类内部”
C++ SELF
等级 69,
课时 4
我们讲解“将互斥锁放在类内部”的实践:为什么外部的
std::mutex
几乎不可避免地导致忘记加锁和数据竞争,如何通过
std::lock_guard
构建自我约束的接口,为什么在
const
方法中可能需要
mutable
,以及如何通过
snapshot()
安全地读取数据。以线程安全的
TaskLog
为例,展示如何设计复合操作(
add_and_size()
)以及应避免的错误(对容器的引用泄露、不同步的读取、过长时间持有
lock
、多个互斥量时的
deadlock
风险)。
Please enable JavaScript to continue using this application.