在 Go 语言里,sync.Cond 的 Wait 方法应当如何调用?请说明其使用方式与注意事项。
考察说明
考查对 Go 并发原语 sync.Cond 中 Wait 方法调用规范与内部机制的理解。
回答思路
- 【回答框架 1】sync.Cond 用于在多个 goroutine 间按条件等待或通知,Wait 方法必须在持有与 Cond 关联的锁(通常是 Mutex)时调用,否则会引发 panic。
- 【回答框架 2】Wait 的内部行为是:先原子地释放关联锁并挂起当前 goroutine,直到被 Signal 或 Broadcast 唤醒后,重新获取该锁并返回,因此调用后需在循环中重新检查条件。
- 【回答框架 3】标准使用模式为:调用方先加锁,再用 for 循环判断条件是否满足,不满足则调用 Wait,满足则继续执行并解锁;避免使用 if 判断,防止虚假唤醒或条件变化导致错误。
- 【回答框架 4】Wait 方法没有参数,也不返回错误,其唤醒通知由 Cond 的 Signal(唤醒一个等待者)或 Broadcast(唤醒全部等待者)触发,调用通知方法时也需持有锁。
- 【回答框架 5】使用 Cond 时需注意与锁的配对,确保每次 Wait 前已加锁,且 Wait 返回后条件可能仍不满足,必须重新检查;同时避免在持有锁时长时间阻塞,以免影响并发性能。
- 【关键点 1】Wait 必须在持有 Cond 关联锁时调用,否则 panic。
- 【关键点 2】Wait 会先释放锁并挂起,唤醒后重新获取锁再返回。
- 【关键点 3】使用 for 循环而非 if 检查条件,以应对虚假唤醒。
- 【关键点 4】Signal 唤醒一个等待者,Broadcast 唤醒全部,调用时也需持锁。
- 【关键点 5】Cond 适用于需要条件变量的场景,但需谨慎管理锁与等待循环。
- 【易错点 1】未持锁调用 Wait 导致 panic。
- 【易错点 2】用 if 判断条件可能因虚假唤醒或条件变化而错误继续执行。
- 【易错点 3】忘记在 Wait 返回后重新检查条件,导致逻辑错误。