文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
sync.Cond
sync.Cond是Golang标准库提供的一个基于互斥锁/读写锁实现的条件变量类型,用于协调访问共享资源的多个goroutine。当共享资源状态发生变化时,可以通知等待条件变化而阻塞的goroutine。sync.Cond提供了一个创建方法和三个成员方法,如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
- NewCond(l Locker) ,创建Cond对象,需要传入一个锁对象,互斥锁或读写锁;
- Wait(),阻塞当前goroutine,等待通知信号;
- Signal(),发送信号通知,唤醒一个等待的goroutine;
- Broadcast(),发送信号通知,唤醒多个等待的goroutine。
sync.Cond需要与一个互斥锁或读写锁一起使用,以确保不会同时操作共享资源。当处于锁定状态时,goroutine将阻塞在Wait()方法中,直到另一个goroutine通过Broadcast()、Signal()方法发出通知信号。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
使用方法和示例
具体使用方法如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
创建一个Mutex对象
创建Cond对象,传入Mutex
等待通知信号,阻塞当前goroutine
发送通知信号,唤醒一个或多个等待的goroutine
看一个示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
输出内容如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
可以看出,Signal()方法只唤醒了一个goroutine,可以把第二十行更改为c.Broadcast(),运行看下效果,会发现所有goroutine都被唤醒了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
小结
sync.Cond通过基于底层机制制定通知等待列表,在goroutine等待通知时将它添加到等待通知的列表中,然后通过Signal()或Broadcast()方法发出通知信号来唤醒等待的goroutine,实现条件变量和goroutine的通信和同步。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html
使用sync.Cond可以使并发编程更加高效和灵活,避免了使用time.Sleep()或者空for循环的一些缺点。但是,使用条件变量也需要小心使用,必须避免死锁和竞态条件等问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48845.html