手记

【九月打卡】第18天 go--排查锁问题、channel学习(1)

课程名称:深入Go底层原理,重写Redis中间件实战


课程章节:6-11,7-1,7-2

课程讲师:Moody



课程内容:

※锁可能出现的问题

  1.     锁copy问题,锁原则上是不能被copy的,一旦copy很可能把锁的状态也复制过来,造成不可预知的错误,为此go提供了一个检查锁错误的工具

    go vet main.go

    vet命令也可以检查很多其他的bug,是一个go自带的简单的代码检查工具

  2. race 检查

        可以发现隐性的数据竞争问题,通常的建议就是加锁

※channel


  • 为什么使用管道通信来共享内存

    1. 避免协程竞争和数据冲突问题

    2.更高级抽象,降低开发难度,管道通信是一种通信方式,只需要监听即可,无需多次轮训来耗费资源

    3.模块之间更容易解耦,增加扩展性和可维护性

  • channel的结构

    type hchan struct {

     qcount   uint           

     dataqsiz uint         

     buf      unsafe.Pointer 

     elemsize uint16

     closed   uint32

     elemtype *_type 

     sendx    uint   

     recvx    uint   

     recvq    waitq  

     sendq    waitq  

     lock mutex

    }

  1. qcount  channel 中的元素个数

  2. dataqsiz channel 中循环缓存队列的长度

  3. buf channel中缓存区的指针

  4. elemsize channel收发(元素)的大小

  5. elemtype channel收发(元素)的类型

  6. closed 通道关闭的flag,一旦关闭将不能接受新的消息

  7. sendx sendq,发送队列的指针和发送队列

  8. recvx recvq ,接收队列的指针和接收队列

  9. lock 锁,保护整个结构体



channel的收发操作遵循先进先出的设计(FIFO),具体规则是

  • 先从channel 读取数据的协程会显收到数据

  • 先向channel发送数据的协程有权先发数据




0人推荐
随时随地看视频
慕课网APP