三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Go-Select多路复用机制的面试真题与底层实现

Go-Select多路复用机制的面试真题与底层实现

Go-Select多路复用机制的面试真题与底层实现

文章导语

select是Go并发编程中的高级特性。面试官常常通过select考察候选人对Go并发模型的深度理解。本文覆盖select的底层原理和经典面试题。

一、select的随机性原理

funcselectgo(cas0*scase,order0*uint16,ncasesint)(int,bool){// 1. 随机打乱pollorderfori:=rangepollorder{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排序防止死锁。

参考文献

  1. Go源码 runtime/select.go
  2. Go Blog - Go Concurrency Patterns
← 返回列表