写点什么

Golang 并发

用户头像
escray
关注
发布于: 2021 年 04 月 20 日
Golang 并发

极客时间《Go 语言从入门到实践》学习笔记 07

24 | 共享内存并发机制


视频中的代码和课件上的不太一样


// 视频for i := 0; i < 5000; i++ {    wg.Add(1)    go func() {        defer func ()  {            mut.Unlock()        }()        mut.Lock()        counter++        wg.Done()    }()}wg.Wait()
// 课件for i := 0; i < 5000; i++ { wg.Add(1) go func() { defer func () { mut.Unlock() wg.Done() }() mut.Lock() counter++ }()}wg.Wait()
复制代码


主要的差别实在 wg.Done() 的位置,简单测试了一下,两种方法的输出结果都是对的。


按照老师在留言中的回复,wg.Done() 和 wg.Add(1) 应该是对应的,那么视频中的写法应该更符合本意。


老师在视频最后的补充说明:


WaitGroup 相当于 Java 中的 Join


Mutex 和 RW lock 都是共享内存机制,尽量使用 RW lock


  • 两个读锁不是互斥锁,共享内存

  • 两个写锁是互斥锁


25 | CSP 并发机制


channel:交互的两方都必须在 Channel 两端才能通信,否则就会阻塞。


buffer channel:消息的发送者和接收者松耦合,Channel 可以有一个容量。如果容量满了,发送方等待;如果容量是空的,那么接收方等待。


有一点好奇,channel 的应用场景是否要少一些?


老师从这一讲开始已经不再现场写代码,而是直接对着代码来讲么?


之前的负面评论者已经消失了。


26 | 多路选择和超时控制


select 多路选择和其他语言中的 switch 比较像( Go 语言中似乎没有 Switch ?),但是从执行顺序(随机选择)和 default 的用法来说有很大的差别。


select 很像 switch,每个 Case 后面跟的是阻塞事件,从 channel 上等待消息。


执行到 select 的时候,只要任何 case 后面的任何一个等待渠道,阻塞事件处于非阻塞状态,就是 channel 中有一个消息,那么就会执行后续的代码


但是不能依赖 case 的顺序。


一定要看留言中的回复。


在 @Van 的留言里面,select 会不等到超时就执行 default 子句,very tricky。


如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。否则,如果有 default 子句,则执行该语句;如果没有 default 子句,select 将阻塞,直到某个通信可以运行;

发布于: 2021 年 04 月 20 日阅读数: 37
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
Golang 并发