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详细理解相关推荐

  1. Golang sync.Cond 简介与用法

    文章目录 1.简介 2.使用场景 3.原理 4.使用示例 5.注意事项 参考文章 1.简介 sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine. ...

  2. GoLang之使用sync.Cond

    文章目录 GoLang之使用sync.Cond 1.Cond结构体 1.1.Cond结构体 1.2Broadcast方法 1.3Signal方法 1.4Wait方法 2.NewCond函数 3.介绍 ...

  3. GoLang之使用sync.pool和sync.cond

    GoLang之使用sync.pool和sync.cond 目录 GoLang之使用sync.pool和sync.cond 1.sync.Pool结构体 1.1sync.Pool结构体 1.2Put方法 ...

  4. Golang interface 接口详细原理和使用技巧

    文章目录 Golang interface 接口详细原理和使用技巧 一.Go interface 介绍 interface 在 Go 中的重要性说明 interface 的特性 interface 接 ...

  5. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

  6. go 条件变量简介 sync.Cond

    以下内容转载自  https://ieevee.com/tech/2019/06/15/cond.html#newcond NewCond Broadcast Signal Wait 举个例子 修改1 ...

  7. Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)

    参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...

  8. go学习笔记 sync/Cond源码

    Cond需要指定一个Locker,通常是一个*Mutex或*RWMutex. func (c *Cond) Broadcast() 和 func (c *Cond) Signal() 唤醒因wait ...

  9. 条件变量 sync.Cond

    sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用. sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻 ...

最新文章

  1. 数据中心机房空调系统的这些“套路”你知多少?
  2. SpringMVC数据库链接池,以及其他相关配置
  3. Linux查看CPU型号及内存频率及其它信息与清理内存的命令
  4. jquery点击完一个按钮,并且触发另一个按钮
  5. 移动混合开发之android文件管理新建文件和删除文件
  6. 吴恩达深度学习5.1笔记_Sequence Models_循环序列模型
  7. Serengeti Accomodation
  8. Hadoop学习之旅
  9. 【软件测试】自动化测试到底怎么做(单元测试自动化,接口自动化,UI自动化)
  10. 证券交易系统术语介绍
  11. 信息课为什么不叫计算机课,让信息技术课“美”起来
  12. 后端使用postman进行测试
  13. java 从set取值_怎样从java集合类set中取出数据?
  14. 堂堂985毕业就失业,我用3000块买大厂Offer
  15. uview去除u-button按钮自带边框细线
  16. AVR单片机网址推荐
  17. 水果店圈子:水果店坏水果应该怎么处理,水果店卖剩下的水果如何处理
  18. 402-字符串(题目:剑指Offer58-II.左旋转字符串、 28. 实现 strStr()、459.重复的子字符串)
  19. 2022-2028年中国医用级空气消毒机行业市场深度分析及前瞻研究报告
  20. STM32外部Flash移植FATFS笔记

热门文章

  1. RK3566-安卓一体机-用户案例
  2. Linux on IBM Cloud - Port Knocking
  3. yii mysql gii_yii框架之gii的使用
  4. STM32——EMWIN对话框(十二)
  5. Feed Ratios_usaco3.2_暴力
  6. 新浪短链接 新浪t.cn短链接在线生成生成工具
  7. 论文翻译—Ciphertext-Policy Attribute-Based Encryption
  8. xero 软件学习_使用PHP与Xero连接
  9. 运维python要掌握到什么程度_运是什么意思 运字五行属什么
  10. vue渲染大量数据如何优化_大数据量场景下的Vue性能优化