[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为此等待,该通知就会被直接丢弃。

http://img2.58codes.com/2024/20131728Z1owkaveAG.png

http://img2.58codes.com/2024/20131728zF5WMMpfIS.png

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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章