为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

课程名称:深入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://img1.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://img1.sycdn.imooc.com//632b3e580001ff9914390805.jpg


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

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

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

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




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消