标准答案

  1. 信号量适合限制同时访问连接、文件或外部依赖的任务数量。
  2. 倒计时门闩适合等待若干初始化或子任务完成,通常不能复用。
  3. 屏障适合多个参与者在阶段边界同步,参与者退出和超时必须有定义。
  4. 条件变量配合锁等待状态变化,唤醒后必须重新检查条件并处理虚假唤醒。

题目解析

信号量表示可用许可数量,适合限制并发;倒计时门闩表示一次性等待一组事件;屏障表示多个参与者在阶段边界会合;条件变量则等待共享状态满足条件。它们的生命周期和复用语义不同。

选择原语时要明确谁负责释放、参与者失败时是否还能继续、超时后其他参与者怎么办。仅仅让主流程“等到成功”不够,异常和取消必须有出口。

条件变量和门闩只解决进程内协作,跨进程任务还需要持久化状态或外部协调。信号量控制并发也不等于保护业务不变式,最终写入仍需原子约束。

常见误区

  • 误区:把信号量当作任务队列。改正:信号量只提供许可,不保存任务;任务需要队列或持久化记录。
  • 误区:门闩计数在异常路径不递减。改正:每个参与者都要有完成、失败或取消的释放路径,避免永久等待。
  • 误区:条件变量不持锁检查状态。改正:在锁保护下循环检查谓词,唤醒后重新判断,不能假设一次唤醒就满足条件。

作者信息