golang sync.Cond基本使用

sync.Cond在Go中用于协调访问共享资源的goroutine。它提供Broadcast和Signal方法来唤醒等待的goroutine,而Wait方法让goroutine挂起直到被通知。在示例中,当作者写完后,通过Broadcast唤醒所有等待的读者开始阅读。

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

  1. https://pkg.go.dev/sync#Cond.Broadcast
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值