[Golang]同步工具-sync包的Wait、Signal、Broadcast方法说明-心智图总结

1. 条件变数的Wait方法,做了什麽?
Wait方法的用途,为等待通知。
先看一下Wait方法的程序码。

func (c *Cond) Wait() {
  c.checker.check()
  t := runtime_notifyListAdd(&c.notify)
  c.L.Unlock()
  runtime_notifyListWait(&c.notify, t)
  c.L.Lock()
}

A. 把调用它的goroutine(也就是当前的goroutine)加入到条件变数的通知队列中。
B. 解锁当前条件变数的那个互斥锁。
C. 让当前的goroutine处於等待状态,等到通知到来时,再决定是否唤醒它。
此时,这个goroutine就会阻塞在呼叫Wait方法的那ㄧ行程序码上。
D. 如果通知到来并且决定唤醒这个goroutine,那麽就会在唤醒它之後,重新锁定当前条件变数的那个互斥锁。
当前的goroutine继续执行後面的程序码。
总结Wait方法的流程是:加入到通知队列 -> 解锁L -> 等待通知 -> 锁定L

E. Wait的简易程序码:
c.L.Lock()
for condition() {
c.Wait()
}
c.L.Unlock()

2. 条件变数的Signal方法与Broadcast方法,有哪些差异?
A. 这两个方法都是用来发送通知。
B. Signal方法只会唤醒一个为此等待的goroutine,而Broadcast会唤醒锁有为此等待的goroutine。
(Wait方法会把当前的goroutine添加到通知队列的队尾,而Signal方法会通知队列的第一次)

C. 与Wait方法不同,条件变数的Signal和Broadcast方法,并不需要在互斥锁的保护下执行。
D. 条件变数的通知有即时性。如果发送通知的时候,没有goroutine为此等待,该通知就会被直接丢弃。

https://ithelp.ithome.com.tw/upload/images/20201123/20131728Z1owkaveAG.png

https://ithelp.ithome.com.tw/upload/images/20201123/20131728zF5WMMpfIS.png

参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


<<:  JS 属性列举与原型的关系 DAY70

>>:  [鼠年全马] W38 - 使用Vuex管理资料状态(上)

[前端暴龙机,Vue2.x 进化 Vue3 ] Day23.正式进化-Vue3 起手式

ゴキゲンな蝶になって きらめく风に乗って 今すぐキミに会いに行こう 余计な事なんて忘れた方がマシさ...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day14.监听器

虽然之前提过的 计算属性 computed,就有监听的功能了,不过有时候我们仍需要一个属於自己定义的...

day18 kotlin - flow基本操作

我会从文档中挑几个重要的出来讲,但不会是全部,我会着重一些基本的中间操作,异常,取消,dispatc...

(Day15) 闭包进阶使用,工厂模式及私有方法。

上回介绍闭包概念以及闭包大致运用,这次则介绍实做比较常用闭包的几种模式 工厂模式 上个章节有介绍到,...

DAY18 搞样式--CSS Gird 是什麽?

前言 因为这次排班小工具作品需要用到月历呈现方式,经过了小小思考觉得...好像用 CSS Gird ...