Golang中的同步工具Sync.Cond详解 世界球精选
时间:2023-06-28 01:25:47来源:今日头条


(资料图片仅供参考)

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循环的一些缺点。但是,使用条件变量也需要小心使用,必须避免死锁和竞态条件等问题。

标签:

生活指南
  • 地球早期蛇纹石化过程为合成氨基酸提供原料

    6月26日,科技日报记者从中国科学院海洋研究所获悉,该所深海中心孙卫

  • 天天头条:迎亚运 优景观 园林专家来助力

    【来源:丽水市住房和城乡建设局_单位动态】为全面贯彻迎亚运的相关文

  • 每日消息!漯河一学校公布学区划分!

    根据《漯河市教育局关于2023年义务教育阶段学校招生工作的意见》文件精

  • 全球今热点:海光信息跌9.11% 中信证券在其高点喊买入

    海光信息跌9 11%中信证券在其高点喊买入

  • 天天快消息!职棒大联盟伦敦系列赛红雀、小熊各胜一场

    随着圣路易斯红雀队25日以7:5击败芝加哥小熊队,美国职棒大联盟(MLB)

  • 热点在线丨股东表决权的行使方式有哪些?中华人民共和国公司法第一百零三条规定内容上是什么?

    股东会的表决方式有:1、可分为赞成票、反对票和弃权;2、可分为一般

  • 久利之事勿为众争之地勿往的全段_久利之事勿为众争之地勿往

    1、1 有长久的利益的事情不要做。2、大家都争着前往的地方不要去不要因

  • 狼毒是什么?狼毒的主要价值是什么?-天天热闻

    狼毒是什么?狼毒是瑞香科狼毒属多年生草本植物。根茎粗壮,圆柱形,

  • 世界速讯:pages文稿多余的空白页怎么删除?Premiere Pro 2019怎么取消工具提示选项?

    pages文稿多余的空白页怎么删除?1、在Mac,我们点击启动。2、在启动

  • 全球微速讯:掀背式尾门设计 全新江淮A5 PLUS上市售价6.58万元起

    北京时间6月24日,江淮A5 PLUS正式上市,全系共推出4款车型,均搭载1 5

  • 沈阳:全日制中专以上毕业生购房可享受全额契税补贴_观点

    沈阳市政府开展了“沈水之阳,我心向往——青年英才‘留沈阳,好住房’

  • for中文是什么意思_for的意思

    1、用作介词时,for翻译为“(表示对象、目的等。)给,对;对于;关于;

  • 自己炸果子怎么和面_自家炸果子怎样和面

    1、1 首先,选择优质面粉。面粉的质量决定了我们面团的质量,所以这是

  • 你知道买什么基金好吗?卖出基金的正确方法是什么?

    你知道买什么基金好吗?【1】收益高,我们看不到基金的未来收益,但

  • 大连市代表团将赴津出席世界经济论坛第十四届新领军者年会

    大连市代表团将赴津出席世界经济论坛第十四届新领军者年会,大连市,领军

  • 世界短讯!北京2023二建查分:北京市人力资源和社会保障网

    北京2023二建查分官网:北京市人力资源和社会保障网由二级建造师考试栏

  • 民生
    • 普里戈仁去哪了

    • win7旗舰版找不到iis_win7旗舰版iis安装包 天天观热点

    • 长沙个人可以缴纳公积金吗?长沙住房公积金可以自己交吗?

    • DirectX8.1b及以上版本是什么意思?DirectX8.1b及以上版本怎么更新?_世界快看点