Go-Select多路复用机制的面试真题与底层实现
文章导语
select是Go并发编程中的高级特性。面试官常常通过select考察候选人对Go并发模型的深度理解。本文覆盖select的底层原理和经典面试题。
一、select的随机性原理
go
func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) {
// 1. 随机打乱pollorder
for i := range pollorder {
j := fastrandn(uint32(i + 1))
pollorder[i], pollorder[j] = pollorder[j], pollorder[i]
}
// 2. 按锁地址排序lockorder(防死锁)
// 3. 检查可执行case
// 4. 全部不可执行→阻塞
}
二、面试真题
Q: select中多个case同时就绪,选哪个?
A: 随机选择,防止case饿死。
Q: select{}和for{}的区别?
A: select{}永久阻塞无CPU消耗,for{}死循环占满CPU。
Q: nil channel在select中的行为?
A: 被忽略,可用于动态禁用case。
三、全文总结
select随机执行就绪case,nil channel在select中被忽略,default实现非阻塞操作,lockorder排序防止死锁。
参考文献
- Go源码 runtime/select.go
- Go Blog - Go Concurrency Patterns