公众号merlinsea


  • sync包下的互斥锁
    • 场景:当多个协程对共享变量执行写操作的时候就会发生资源竞争,需要用互斥锁。
    • 特点:
      • 互斥锁必须是全局的,即所有协程共用同一把互斥锁
      • 在需要写出执行的代码中对共享变量的写操作加锁。



  • 管程channel
    • 管道是一个队列的数据结构,数据遵循了先进先出的原则
    • 管道本身是线程安全的,即多个协程操作同一个管道的时候不需要对管道进行加锁。
    • 管道是有类型的,即一个string类型的管道只能放string类型的数据
    • 管道是引用数据类型,即必须make以后才能使用,make的时候需要指定管道的容量,这个容量是不会改变的,后续最多也只能向这个管道中放入指定容量的数据,多了会deadlock死锁。
    • 管道在close关闭以后就不能向管道中写入数据但依旧可以从管道中读取数据
    • 管道的遍历只能使用for-range遍历
      • 在for-range遍历的时候如果管道没有关闭会出现deadlock死锁问题。
      • 在for-range遍历的时候如果管道关闭了,则正常遍历结束。
      • 因此遍历管道的注意事项: 1、关闭管道 2、 用for-range遍历


  • 管道实现多协程之间的通信设计
    • 由于主线程推出以后,基于主线程环境创建的协程也会结束,因此必须有一个通信机制使得主线程在其他协程执行的时候阻塞。