在 Go语言 并发编程中,除了常见的 sync.Mutex 和 channel,sync 包还提供了一个强大但常被忽视的同步原语:sync.Cond。本文将深入浅出地讲解 sync.Cond 的 Broadcast 方法如何实现“一对多”的唤醒机制,并通过一个完整示例帮助你彻底掌握其用法。

sync.Cond 是 Go 语言标准库中用于协调多个 goroutine 等待某个条件成立的同步工具。它通常与互斥锁(如 *sync.Mutex)配合使用。
它的核心方法包括:
Wait():阻塞当前 goroutine,直到被唤醒;Signal():唤醒一个等待中的 goroutine;Broadcast():唤醒所有等待中的 goroutine。其中,Broadcast 是本文的重点——它能一次性通知所有等待者,非常适合“事件广播”类场景。
想象这样一个场景:有一个任务队列,多个工作 goroutine 在等待新任务到来。当主 goroutine 添加一批任务后,希望所有工作 goroutine 都能立即开始处理。这时,使用 Broadcast 就比逐个调用 Signal 更高效、更简洁。
下面是一个完整的 Go 示例,演示如何用 sync.Cond 的 Broadcast 方法唤醒多个等待的 goroutine:
package mainimport ( "fmt" "sync" "time")func main() { var mu sync.Mutex cond := sync.NewCond(&mu) // 模拟 3 个工作 goroutine for i := 1; i <= 3; i++ { go func(id int) { mu.Lock() fmt.Printf("Worker %d 等待任务...\n", id) cond.Wait() // 阻塞等待 fmt.Printf("Worker %d 收到任务,开始工作!\n", id) mu.Unlock() }(i) } // 主 goroutine 稍作延迟后广播任务 time.Sleep(2 * time.Second) mu.Lock() fmt.Println("主程序:发布任务,唤醒所有 Worker!") cond.Broadcast() // 关键:唤醒所有等待者 mu.Unlock() // 等待所有 goroutine 完成 time.Sleep(1 * time.Second)}mu,并用它初始化 sync.Cond;cond.Wait() 进入等待状态(此时会自动释放锁);cond.Broadcast(),通知所有等待的 goroutine;运行结果大致如下:
Worker 1 等待任务...Worker 3 等待任务...Worker 2 等待任务...主程序:发布任务,唤醒所有 Worker!Worker 1 收到任务,开始工作!Worker 2 收到任务,开始工作!Worker 3 收到任务,开始工作!Wait、Signal 或 Broadcast 前,必须持有与 Cond 关联的锁;Wait() 会自动释放锁并阻塞,被唤醒后会重新获取锁;Signal() 更高效。通过本文,你已经掌握了 Go语言 中 sync.Cond 的 Broadcast 唤醒机制。它是实现“一对多”通知模式的有力工具,特别适用于需要同时唤醒多个等待者的并发场景。
记住关键点:sync.Cond 必须与互斥锁配合使用,Broadcast 能唤醒所有等待者,而合理使用它可以让你的并发程序更加高效和清晰。
现在,你可以尝试在自己的项目中应用这一强大的同步原语了!
本文关键词:Go语言、sync.Cond、Broadcast、唤醒机制
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126817.html