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为此等待,该通知就会被直接丢弃。
参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/
>>: [鼠年全马] W38 - 使用Vuex管理资料状态(上)
ゴキゲンな蝶になって きらめく风に乗って 今すぐキミに会いに行こう 余计な事なんて忘れた方がマシさ...
虽然之前提过的 计算属性 computed,就有监听的功能了,不过有时候我们仍需要一个属於自己定义的...
我会从文档中挑几个重要的出来讲,但不会是全部,我会着重一些基本的中间操作,异常,取消,dispatc...
上回介绍闭包概念以及闭包大致运用,这次则介绍实做比较常用闭包的几种模式 工厂模式 上个章节有介绍到,...
前言 因为这次排班小工具作品需要用到月历呈现方式,经过了小小思考觉得...好像用 CSS Gird ...