Go教程

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

本文主要是介绍【九月打卡】第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

https://img2.sycdn.imooc.com/632b3d760001c46616690686.jpg

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

    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 锁,保护整个结构体


  • https://img2.sycdn.imooc.com/632b3e580001ff9914390805.jpg


  • https://img1.sycdn.imooc.com/632b3eed0001ad9613670612.jpg

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

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

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




这篇关于【九月打卡】第18天 go--排查锁问题、channel学习(1)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!