sync.Cond条件变量用来协调访问共享资源的goroutine,当共享资源状态发生改变时,用于通知被互斥锁堵塞的goroutine
sync.Cond主要多个读协程等待共享资源可用时非常有用
sync.Cond c主要方法有
-
Broadcast: 唤醒所有等待c的goroutine。允许但不要求调用者持有c的锁
-
Signal: 只唤醒一个等待的goroutine。允许但不要求调用者持有c的锁
-
Wait: 挂起调用者goroutine等待被Signal、Broadcast唤醒。因为当Wait等待时没有持有c的锁,所以不一定保证条件为true。因此建议采用采用for进行判断条件是否满足
c.L.Lock() for !condition() { c.Wait() } ... make use of condition ... c.L.Unlock()
简单示例
假如现在有3个读者正在等待作者写完,之后进行阅读
var done =false
func read(id int,c *sync.Cond){
c.L.Lock()
for !done{
c.Wait()
}
log.Info("start reading")
c.L.Unlock()
}
func write(c *sync.Cond){
log.Info("start writing")
c.L.Lock()
done=true
c.L.Unlock()
c.Broadcast()
}
func main() {
cond := sync.NewCond(&sync.Mutex{})
go read("reader1", cond)
go read("reader2", cond)
go read("reader3", cond)
write("writer", cond)
time.Sleep(time.Second * 3)
}
Ref
- https://pkg.go.dev/sync#Cond.Broadcast
sync.Cond在Go中用于协调访问共享资源的goroutine。它提供Broadcast和Signal方法来唤醒等待的goroutine,而Wait方法让goroutine挂起直到被通知。在示例中,当作者写完后,通过Broadcast唤醒所有等待的读者开始阅读。

3985

被折叠的 条评论
为什么被折叠?



