sync.Cond是Go中协程等待条件成立的同步机制,需与互斥锁配合使用,核心方法为Wait、Signal和Broadcast;典型应用场景如生产者-消费者模型中高效通知数据就绪,使用时须在循环中检查条件以避免虚假唤醒,根据等待协程数量选择Signal或Broadcast。

在Go语言中,sync.Cond 是一种用于协程间同步的机制,它允许协程等待某个条件成立后再继续执行。虽然日常开发中使用频率不如 channel 或 sync.Mutex 高,但在某些特定场景下,比如多个协程需要等待共享状态变化时,sync.Cond 能提供更精确的控制。
sync.Cond 是“条件变量”(Condition Variable)的实现,它通常与互斥锁(*sync.Mutex 或 *sync.RWMutex)配合使用。它的核心方法有三个:
注意:调用 Wait() 前必须持有锁,而 Wait() 内部会自动释放锁,并在唤醒后重新获取锁。
使用 sync.Cond 的标准流程如下:
立即学习“go语言免费学习笔记(深入)”;
l := &sync.Mutex{}
cond := sync.NewCond(l)
cond.L.Lock()
for !condition() {
cond.Wait()
}
// 处理条件满足后的逻辑
cond.L.Unlock()
关键点在于:必须在循环中检查条件,避免虚假唤醒(spurious wakeup)导致的问题。
假设我们有一个缓冲区,生产者向其中添加数据,消费者等待数据到来后再读取。我们可以用 sync.Cond 实现高效的等待/通知机制。
YDUI Touch专为移动端打造,在技术实现、交互设计上兼容主流移动设备,保证代码轻、性能高;使用 Flexbox 技术,灵活自如地对齐、收缩、扩展元素,轻松搞定移动页面布局;用 rem 实现强大的屏幕适配布局,等比例适配所有屏幕;自定义Javascript组件、Less文件、Less变量,定制一份属于自己的YDUI。
81
package main
<p>import (
"fmt"
"sync"
"time"
)</p><p>type Queue struct {
items []int
lock <em>sync.Mutex
cond </em>sync.Cond
}</p><p>func NewQueue() *Queue {
lock := &sync.Mutex{}
return &Queue{
items: make([]int, 0),
lock: lock,
cond: sync.NewCond(lock),
}
}</p><p>func (q *Queue) Put(item int) {
q.lock.Lock()
defer q.lock.Unlock()
q.items = append(q.items, item)
q.cond.Signal() // 唤醒一个等待的消费者
}</p><p>func (q *Queue) Get() int {
q.lock.Lock()
defer q.lock.Unlock()
for len(q.items) == 0 {
q.cond.Wait() // 等待数据到来
}
item := q.items[0]
q.items = q.items[1:]
return item
}</p><p>func main() {
queue := NewQueue()</p><pre class='brush:php;toolbar:false;'>// 启动消费者
go func() {
for {
val := queue.Get()
fmt.Printf("Consumed: %d\n", val)
}
}()
// 生产者
for i := 0; i < 5; i++ {
queue.Put(i)
time.Sleep(100 * time.Millisecond)
}
time.Sleep(time.Second)}
在这个例子中,消费者调用 Get() 时如果队列为空,就会进入等待状态。生产者每次放入数据后调用 Signal(),唤醒一个消费者。这种方式比轮询更高效,也比使用 channel 更灵活(例如可以动态控制唤醒策略)。
Signal() 即可。Broadcast()。例如,在缓存失效通知场景中,多个读协程可能都在等待更新,此时应广播唤醒全部协程。
基本上就这些。sync.Cond 不复杂但容易忽略细节,关键是配对使用锁、在循环中检查条件、正确选择唤醒方式。合理使用能提升程序效率和响应性。
以上就是Golangsync.Cond条件变量使用实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号