Golang中的同步工具Sync.Cond详解


【资料图】

sync.Cond

sync.Cond是Golang标准库提供的一个基于互斥锁/读写锁实现的条件变量类型,用于协调访问共享资源的多个goroutine。当共享资源状态发生变化时,可以通知等待条件变化而阻塞的goroutine。sync.Cond提供了一个创建方法和三个成员方法,如下:

NewCond(l Locker) ,创建Cond对象,需要传入一个锁对象,互斥锁或读写锁;Wait(),阻塞当前goroutine,等待通知信号;Signal(),发送信号通知,唤醒一个等待的goroutine;Broadcast(),发送信号通知,唤醒多个等待的goroutine。

sync.Cond需要与一个互斥锁或读写锁一起使用,以确保不会同时操作共享资源。当处于锁定状态时,goroutine将阻塞在Wait()方法中,直到另一个goroutine通过Broadcast()、Signal()方法发出通知信号。

使用方法和示例

具体使用方法如下:

创建一个Mutex对象
var mutex = sync.Mutex{}
创建Cond对象,传入Mutex
cond := sync.NewCond(&mutex)
等待通知信号,阻塞当前goroutine
cond.Wait()
发送通知信号,唤醒一个或多个等待的goroutine
cond.Signal() // 唤醒一个goroutine// 或者 cond.Broadcast() 唤醒多个goroutine

看一个示例:

package mainimport ("log""sync""time")func read(index int, c *sync.Cond) {c.L.Lock()c.Wait()log.Println(index, "开始读")c.L.Unlock()}func write(c *sync.Cond) {log.Println("开始写")time.Sleep(time.Second)log.Println("唤醒其中一个goroutine")c.Signal()}func main() {cond := sync.NewCond(&sync.Mutex{})for i := 1; i <= 5; i++ {go func(index int) {read(index, cond)}(i)}write(cond)time.Sleep(time.Second * 3)}

输出内容如下:

2023/05/19 22:01:34 开始写2023/05/19 22:01:35 唤醒其中一个goroutine2023/05/19 22:01:35 2 开始读

可以看出,Signal()方法只唤醒了一个goroutine,可以把第二十行更改为c.Broadcast(),运行看下效果,会发现所有goroutine都被唤醒了。

小结

sync.Cond通过基于底层机制制定通知等待列表,在goroutine等待通知时将它添加到等待通知的列表中,然后通过Signal()或Broadcast()方法发出通知信号来唤醒等待的goroutine,实现条件变量和goroutine的通信和同步。

使用sync.Cond可以使并发编程更加高效和灵活,避免了使用time.Sleep()或者空for循环的一些缺点。但是,使用条件变量也需要小心使用,必须避免死锁和竞态条件等问题。

关键词:

为您推荐

Golang中的同步工具Sync.Cond详解

sync Condsync Cond是Golang标准库提供的一个基于互斥锁 读写锁实现的

来源:今日头条2023-06-27

石楼县消防救援大队开展餐饮、燃气行业灭火实战演练暨消防宣传培训活动|全球观热点

为深刻吸取银川烧烤店爆炸事故教训,推动餐饮、燃气行业安全形势稳定向

来源:黄河新闻网2023-06-27

区块链是开启人工智能大时代的关键变量_环球即时看

AI大模型时代或已走向终局,前路未知2022年11月30日,人工智能公司Open

来源:ZAKER科技2023-06-27

宋慧乔晒无水印大片好美,工作人员晒乔妹花絮视频:生图好漂亮!

宋慧乔晒无水印大片好美,工作人员晒乔妹花絮视频:生图好漂亮!,微卷,

来源:笑猫说说2023-06-27

我们和海马体、周大生、朗姿聊了聊,视频号到底怎么做?-热议

编者按:本文来自微信公众号剁椒TMT(ID:ylwanjia),作者:ljl,创业

来源:创业邦2023-06-27

分享砂锅肉末茄子煲的做法 ,天冷别炒菜了,教你做4道“砂锅煲”,营养好吃还暖和,别不懂吃 今日快讯

到了秋冬季节,炒菜一上桌就凉了,不仅吃起来不香,而且对身体还不好。

来源:红五百科2023-06-27

花与蛇电影剧情_花与蛇电影剧情介绍

欢迎观看本篇文章,小升来为大家解答以上问题。花与蛇电影剧情,花与蛇

来源:互联网2023-06-27

【环球新视野】《高空跳江救人 笑称自己很怂》后续:跳桥救人的湘籍外卖小哥彭清林被邀落户杭州

华声在线6月25日讯(全媒体记者田甜视频刘文)31岁的张家界桑植县小伙

来源:华声在线2023-06-27