AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
Busy-wait vs blocking
C++ SELF
等级 70,
课时 0
解析“忙等”(
busy-wait
/
polling
,即“转圈等待”)与正常的阻塞等待之间的区别:为什么循环
while
(!
ready
) 会对 CPU 和电池有害,
sleep_for
-polling 是怎样的折中,以及
std::condition_variable
与
wait(lock, predicate)
提供了怎样的等待模型。
std::condition_variable: wait(lock, predicate)
C++ SELF
等级 70,
课时 1
我们来讲解为什么在有
std::mutex
的情况下仍然需要
std::condition_variable
,为什么我们“等待状态而不是信号”,以及如何正确地用
std::unique_lock
使用
wait(lock, predicate)
。通过带有
ready
标志、任务队列和“令牌”的示例来巩固这个模式,讨论
notify_one()
/
notify_all()
以及典型错误(裸的
wait(lock)
、谓词中的副作用、在没有互斥量的情况下访问状态)。
Producer–consumer — 任务队列与工作线程
C++ SELF
等级 70,
课时 2
分析 C++ 中经典的
producer–consumer
模型:如何基于
std::queue
在
std::mutex
保护下组织任务队列,如何通过
std::condition_variable
和
wait(lock, predicate)
来“让 worker 睡眠”,为什么临界区的边界很重要(“取了任务就释放锁”),以及哪些错误最常破坏协议(忙等、在没有锁的情况下读取
empty()
、丢失通知、引用已删除的元素)。
伪唤醒 — 为什么需要 predicate
C++ SELF
等级 70,
课时 3
我们来分析为什么
std::condition_variable
可能在没有
notify_one()
/
notify_all()
的情况下“醒来”,为什么
if
+
wait
是反模式,如何用
wait(lock, predicate)
(或手动使用
while
)避免
spurious wakeup
和
lost wakeup
,以及如何实现带有“工作或关闭”协议的正确任务队列(
TaskQueue::pop()
/
close()
)。
Shutdown protocol — 如何停止 worker thread
C++ SELF
等级 70,
课时 4
解析在 C++ 中正确停止
worker thread
的协议:为什么在
std::condition_variable
上通过
cv.wait
等待可能会永远阻塞,如何添加状态
closed
并按谓词
closed
||
!
q.empty()
正确等待,为什么在 shutdown 时几乎总是需要
notify_all()
,以及如何实现可读的
pop()
,返回
std::optional<T>
/
std::nullopt
,以便 worker 循环能够诚实地结束且不丢失任务。
Please enable JavaScript to continue using this application.