前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Golang】sync.NewCond条件等待用法

【Golang】sync.NewCond条件等待用法

作者头像
MaybeHC
发布于 2024-04-23 11:34:55
发布于 2024-04-23 11:34:55
11500
代码可运行
举报
文章被收录于专栏:技术之路技术之路
运行总次数:0
代码可运行

条件等待和互斥锁有不同,互斥锁是不同协程公用一个锁,条件等待是不同协程各用一个锁,但 是wait()方法调用会等待(阻塞),直到有信号发过来,不同协程是共用信号。 可以看如下的代码来理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	wg := sync.WaitGroup{}
	cond := sync.NewCond(new(sync.Mutex))
	for i:=0 ; i<3 ;i++{
		go func(i int) {
			wg.Add(1)
			fmt.Println("协程启动")
			cond.L.Lock()//加锁
			fmt.Println("协程  ",i,"加锁")
			cond.Wait()
			cond.L.Unlock()//解锁
			fmt.Println("协程  ",i,"解锁")
			defer wg.Done()
		}(i)
	}
	time.Sleep(time.Second * 2)
	//发送信号
	cond.Signal()
	fmt.Println("主协程发送信号")
	time.Sleep(time.Second * 2)
	//发送信号
	cond.Signal()
	fmt.Println("主协程发送信号")

	time.Sleep(time.Second * 2)
	//发送信号
	cond.Signal()
	fmt.Println("主协程发送信号")

	wg.Wait()
}

我们可以多次运行得到多种结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
协程启动
协程启动
协程启动
协程   0 加锁
协程   2 加锁
协程   1 加锁

主协程发送信号
协程   0 解锁
主协程发送信号
协程   2 解锁
主协程发送信号
协程   1 解锁
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
协程启动
协程启动
协程启动
协程   2 加锁
协程   0 加锁
协程   1 加锁

主协程发送信号
协程   2 解锁
主协程发送信号
协程   0 解锁
主协程发送信号
协程   1 解锁

三个协程都申请了锁,在没有发送信号之前,三个协程都无法获得锁,只有当发出信号后,三个协程中的其中一个线程将获得锁(随机)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go 协程三种同步实现
运维开发王义杰
2023/08/21
2890
go 协程三种同步实现
Go并发编程之美-条件变量
go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中与锁相关的条件变量
加多
2019/02/15
5990
go的sync包的使用详解2-日常实战总结7
关于sync包,我们继续讲。这里我们要讲sync.NewCond。要讲这个的使用我们先来了解个概念。
公众号-利志分享
2022/04/25
5570
Go-标准库-sync(三)
条件变量(Cond)是 sync 包中用于等待和通知 goroutine 的机制。条件变量需要和互斥锁配合使用,常用于等待某个条件达成的情况下,通知其它 goroutine 可以继续执行。条件变量有两个主要的方法:Wait() 和 Signal()。Wait() 方法用于等待条件变量的通知,会自动释放互斥锁,并将当前 goroutine 挂起;Signal() 方法用于通知等待在条件变量上的一个 goroutine 可以继续执行,如果没有等待的 goroutine,则该通知会被忽略。
堕落飞鸟
2023/04/22
1560
这一次,彻底搞懂 Go Cond
本篇文章会从源码角度去深入剖析下 sync.Cond。Go 日常开发中 sync.Cond 可能是我们用的较少的控制并发的手段,因为大部分场景下都被 Channel 代替了。还有就是 sync.Cond 使用确实也蛮复杂的。
haohongfan
2021/04/26
4400
这一次,彻底搞懂 Go Cond
Go 并发编程面试题
在 Go 语言的同步库中,sync.Mutex是用来提供互斥锁的基本同步原语。Mutex用于保护共享资源,在多个 goroutine 尝试同时访问相同资源时确保只有一个 goroutine 能够访问该资源,从而避免竞态条件。
Lemon黄
2023/12/13
7330
Go 并发编程面试题
Go 精妙的互斥锁设计
在并发编程中,互斥锁(Mutex)是控制并发访问共享资源的重要工具。Go 语言的互斥锁设计以其简洁、高效和易用性著称。本文将详细介绍 Go 语言中的互斥锁设计,探讨其内部实现原理,并展示如何在实际项目中正确使用互斥锁。
Michel_Rolle
2024/06/30
2.5K0
Go 语言并发编程系列(十一)—— sync 包系列:条件变量
简介 sync 包还提供了一个条件变量类型 sync.Cond,它可以和互斥锁或读写锁(以下统称互斥锁)组合使用,用来协调想要访问共享资源的线程。
学院君
2019/09/17
7550
Go 语言并发编程系列(十一)—— sync 包系列:条件变量
源码剖析sync.cond(条件变量的实现机制)
哈喽,大家好,我是asong,这是我并发编程系列的第三篇文章,这一篇我们一起来看看sync.Cond的使用与实现。之前写过java的朋友对等待/通知(wait/notify)机制一定很熟悉,可以利用等待/通知机制实现阻塞或者唤醒,在Go语言使用Cond也可以达到同样的效果,接下来我们一起来看看它的使用与实现。
Golang梦工厂
2022/07/08
5140
源码剖析sync.cond(条件变量的实现机制)
Golang sync.Cond 简介与用法
Cond 实现了一个条件变量,在 Locker 的基础上增加的一个消息通知的功能,保存了一个通知列表,用来唤醒一个或所有因等待条件变量而阻塞的 Go 程,以此来实现多个 Go 程间的同步。
恋喵大鲤鱼
2019/08/01
5.9K0
Go 并发实战 -- sync Cond
go中的sync.Cond也就是condition,是一个条件同步变量,与Java中Object的wait、notify、notifyAll方法或者Condition类的作用比较类似,如果有这方面的基础学习起来会非常简单。其实Java中的JUC包实现的可以是最丰富和易用的了,熟知JUC的话,学习其他语言的并发特性及工具的话会非常简单。
邹志全
2019/07/31
9040
GO 语言处理并发的时候我们是选择sync还是channel
以前写 C 的时候,我们一般是都通过共享内存来通信,对于并发去操作某一块数据时,为了保证数据安全,控制线程间同步,我们们会去使用互斥锁,加锁解锁来进行处理
阿兵云原生
2023/10/24
2340
GO 语言处理并发的时候我们是选择sync还是channel
我怎么从来没见过 sync.Cond
sync.Cond 作为 go 标准库提供的一个并发原语,但是可能你从来没听过,可见它使用场景挺少的,但是我们需要有这个知识储备,只有储备了之后才能在需要用的时候用出来。
LinkinStar
2022/09/01
2110
golang 多协程的同步方法总结
之前用 go 写一个小工具的时候, 用到了多个协程之间的通信, 当时随手查了查, 结果查出来一大坨, 简单记录一下. golang中多个协程之间是如何进行通信及数据同步的嘞.
烟草的香味
2020/10/10
5.6K0
Go通关10:并发控制,同步原语 sync 包
您诸位好啊,我是无尘。又到了愉快的周末,肝了一上午,给大家介绍下 sync 包。除了上一节我们介绍的 channel 通道,还有 sync.Mutex、sync.WaitGroup 这些原始的同步机制,来更加灵活的实现数据同步和控制并发。
微客鸟窝
2021/08/18
5600
Go语言sync包的应用详解
在并发编程中同步原语也就是我们通常说的锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱的问题。Go语言的sync包提供了常见的并发编程同步原语,上一期转载的文章《Golang 并发编程之同步原语》中也详述了 Mutex、RWMutex、WaitGroup、Once 和 Cond 这些同步原语的实现原理。今天的文章里让我们回到应用层,聚焦sync包里这些同步原语的应用场景,同时也会介绍sync包中的Pool和Map的应用场景和使用方法。话不多说,让我们开始吧。
KevinYan
2020/05/14
8900
Golang并发编程控制
重学编程之Golang的plan中的上一篇文章我向大家介绍了,并发编程基础,goroutine的创建,channel,正由于go语言的简洁性,我们可以简易快速的创建任意个协程。同时也留下了许多隐患,如果没有更加深入的学习,其实很难直接将其运用到实际项目中,实际生活中。为什么呢?并发的场景许许多多,但一味的只知道其创建,是很难有效的解决问题。例如以下场景-资源竞争
PayneWu
2020/12/18
5640
Golang并发编程控制
GO并发之好用的sync包
很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等。
机智的程序员小熊
2023/03/02
2630
GO并发之好用的sync包
golang sync.Cond使用和实现原理
sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine。当共享资源状态发生变化时,sync.Cond 可以用来通知等待条件发生而阻塞的 Goroutine。
fnatic
2023/06/14
7.8K0
Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现
上一篇 《原生并发 goroutine channel 和 select 常见使用场景》 介绍了基于 CSP 模型的并发方式。
张拭心 shixinzhang
2022/05/10
4000
Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现
相关推荐
go 协程三种同步实现
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文