read.md 1.9 KB

通道的基本操作

0.资料

  1. https://gfw.go101.org/article/channel.html
  2. https://www.cnblogs.com/liang1101/p/7285955.html
  3. https://www.cnblogs.com/sparkdev/p/10930168.html

1. 特性

  1. 对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的。(入和出的互斥性)
  2. 发送操作和接收操作中对元素值的处理都是不可分割的。(入和出的原子性)
  3. 发送操作在完全完成之前会被阻塞。接收操作也是如此。

说明

  1. 通道类型值,本身是并发安全的
  2. 并发执行,是多个代码块分别在不同的 goroutine 之中,并有机会在同一个时间段内被执行。(并发不是同时执行)
  3. 通道分缓冲通道和非缓冲通道

2. panic

  1. 向已经关闭的channel写。
  2. 关闭已经关闭的channel。

3.阻塞

image-20220628235019239

  1. 什么是阻塞,我的理解就是,这个步骤(接受或者发送)执行不了,停在这了,只有当其对应的(发送或者接受)唤醒,才能解除当前阻塞
  2. 无论是读或者写,第一步都是先获取当前通道的锁。
  3. 一般在生产者处关闭通道,在消费者处关闭容易引发恐慌 image-20220704230837390

2. 协程(gorountine)

  1. 进程、线程(内核级线程)、协程(用户级线程)三个概念
  2. 进程、线程由内核调度,有CPU时间片的概念,有多种调度算法
  3. 协程(用户级线程)对内核透明,即系统不知道有协程的存在,是完全由用户自己的程序进行调度控制的。
  4. https://learnku.com/articles/41405

image-20220628225339441

Go 协程(goroutine)通过信道(channel)进行通信。信道可以防止多个协程访问共享内存时发生资源争抢的问题。