Golang sync.Cond详细理解
sync.Cond用于goroutine之间的协作,用于协程的挂起和唤醒。
结构体
type Cond struct {noCopy noCopy // noCopy可以嵌入到结构中,在第一次使用后不可复制,使用go vet作为检测使用L Locker // 根据需求初始化不同的锁,如*Mutex 和 *RWMutexnotify notifyList // 通知列表,调用Wait()方法的goroutine会被放入list中,每次唤醒,从这里取出checker copyChecker // 复制检查,检查cond实例是否被复制
}
相关函数
Wait函数
func (c *Cond) Wait() {// 检查c是否是被复制的,如果是就panicc.checker.check()// 将当前goroutine加入等待队列t := runtime_notifyListAdd(&c.notify)// 解锁c.L.Unlock()// 等待队列中的所有的goroutine执行等待唤醒操作runtime_notifyListWait(&c.notify, t)c.L.Lock()
}
功能: 必须获取该锁之后才能调用Wait()方法,Wait方法在调用时会释放底层锁Locker,并且将当前goroutine挂起,直到另一个goroutine执行Signal或者Broadcase,该goroutine才有机会重新唤醒,并尝试获取Locker,完成后续逻辑。
也就是在等待被唤醒的过程中是不占用锁Locker的,这样就可以有多个goroutine可以同时处于Wait(等待被唤醒的状态)
Signal函数
func (c *Cond) Signal() {// 检查c是否是被复制的,如果是就panicc.checker.check()// 通知等待列表中的一个 runtime_notifyListNotifyOne(&c.notify)
}
功能:唤醒等待队列中的一个goroutine,一般都是任意唤醒队列中的一个goroutine
Broadcast函数
func (c *Cond) Broadcast() {// 检查c是否是被复制的,如果是就panicc.checker.check()// 唤醒等待队列中所有的goroutineruntime_notifyListNotifyAll(&c.notify)
}
功能:唤醒等待队列中的所有goroutine
示例
package mainimport ("sync""fmt""time"
)func main() {locker := new(sync.Mutex)cond := sync.NewCond(locker)for i := 0 ; i < 30 ; i++ {go func(x int) {cond.L.Lock()fmt.Println(x," 获取锁")defer cond.L.Unlock()cond.Wait()fmt.Println(x," 被唤醒")time.Sleep(time.Second)}(i)}time.Sleep(time.Second)fmt.Println("Signal...")cond.Signal()time.Sleep(time.Second)cond.Signal()time.Sleep(time.Second*3)cond.Broadcast()fmt.Println("Broadcast...")time.Sleep(time.Minute)
}
感谢:
https://blog.csdn.net/wentyoon/article/details/81174288
https://my.oschina.net/qiangmzsx/blog/1799695
Golang sync.Cond详细理解相关推荐
- Golang sync.Cond 简介与用法
文章目录 1.简介 2.使用场景 3.原理 4.使用示例 5.注意事项 参考文章 1.简介 sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine. ...
- GoLang之使用sync.Cond
文章目录 GoLang之使用sync.Cond 1.Cond结构体 1.1.Cond结构体 1.2Broadcast方法 1.3Signal方法 1.4Wait方法 2.NewCond函数 3.介绍 ...
- GoLang之使用sync.pool和sync.cond
GoLang之使用sync.pool和sync.cond 目录 GoLang之使用sync.pool和sync.cond 1.sync.Pool结构体 1.1sync.Pool结构体 1.2Put方法 ...
- Golang interface 接口详细原理和使用技巧
文章目录 Golang interface 接口详细原理和使用技巧 一.Go interface 介绍 interface 在 Go 中的重要性说明 interface 的特性 interface 接 ...
- Go中协程间通信的方式Sync.Cond
在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...
- go 条件变量简介 sync.Cond
以下内容转载自 https://ieevee.com/tech/2019/06/15/cond.html#newcond NewCond Broadcast Signal Wait 举个例子 修改1 ...
- Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...
- go学习笔记 sync/Cond源码
Cond需要指定一个Locker,通常是一个*Mutex或*RWMutex. func (c *Cond) Broadcast() 和 func (c *Cond) Signal() 唤醒因wait ...
- 条件变量 sync.Cond
sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻 ...
最新文章
- 数据中心机房空调系统的这些“套路”你知多少?
- SpringMVC数据库链接池,以及其他相关配置
- Linux查看CPU型号及内存频率及其它信息与清理内存的命令
- jquery点击完一个按钮,并且触发另一个按钮
- 移动混合开发之android文件管理新建文件和删除文件
- 吴恩达深度学习5.1笔记_Sequence Models_循环序列模型
- Serengeti Accomodation
- Hadoop学习之旅
- 【软件测试】自动化测试到底怎么做(单元测试自动化,接口自动化,UI自动化)
- 证券交易系统术语介绍
- 信息课为什么不叫计算机课,让信息技术课“美”起来
- 后端使用postman进行测试
- java 从set取值_怎样从java集合类set中取出数据?
- 堂堂985毕业就失业,我用3000块买大厂Offer
- uview去除u-button按钮自带边框细线
- AVR单片机网址推荐
- 水果店圈子:水果店坏水果应该怎么处理,水果店卖剩下的水果如何处理
- 402-字符串(题目:剑指Offer58-II.左旋转字符串、 28. 实现 strStr()、459.重复的子字符串)
- 2022-2028年中国医用级空气消毒机行业市场深度分析及前瞻研究报告
- STM32外部Flash移植FATFS笔记
热门文章
- RK3566-安卓一体机-用户案例
- Linux on IBM Cloud - Port Knocking
- yii mysql gii_yii框架之gii的使用
- STM32——EMWIN对话框(十二)
- Feed Ratios_usaco3.2_暴力
- 新浪短链接 新浪t.cn短链接在线生成生成工具
- 论文翻译—Ciphertext-Policy Attribute-Based Encryption
- xero 软件学习_使用PHP与Xero连接
- 运维python要掌握到什么程度_运是什么意思 运字五行属什么
- vue渲染大量数据如何优化_大数据量场景下的Vue性能优化