github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/docs/007-runtime包channel源码分析.md (about) 1 ### 什么是 CSP 2 3 CSP 全称是 “Communicating Sequential Processes”,这也是 Tony Hoare 在 1978 年发表在 ACM 的一篇论文。论文里指出一门编程语言应该重视 input 和 output 的原语,尤其是并发编程的代码。 4 5 大多数的编程语言的并发编程模型是基于线程和内存同步访问控制,Go 的并发编程的模型则用 goroutine 和 channel 来替代。Goroutine 和线程类似,channel 和 mutex (用于内存同步访问控制)类似。 6 7 Go 的并发原则非常优秀,目标就是简单:尽量使用 channel;把 goroutine 当作免费的资源,随便用。 8 9 Go 并发不要通过共享内存来通信, 而要通过通信来实现内存共享, 它依赖 CSP 模型,基于 channel 实现。 10 11 ### 什么是channel 12 13 Goroutine 和 channel 是 Go 语言并发编程的 两大基石。Goroutine 用于执行并发任务,channel 用于 goroutine 之间的同步、通信。 14 15 Channel 在 gouroutine 间架起了一条管道,在管道里传输数据,实现 gouroutine 间的通信;由于它是线程安全的,所以用起来非常方便;channel 还提供“先进先出”的特性;它还能影响 goroutine 的阻塞和唤醒。 16 17 ```go 18 chan T 19 // 声明一个双向通道 20 21 chan<- T 22 // 声明一个只能用于发送的通道 23 24 <-chan T 25 // 声明一个只能用于接收的通道 26 ``` 27 28 Go 通过 channel 实现 CSP 通信模型,主要用于 goroutine 之间的消息传递和事件通知。 29 30 源码中关于channel 主要的生命周期 31 32 ```go 33 // 创建一个channel 34 func makechan(t *chantype, size int) *hchan 35 // 发送数据 36 func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool 37 // 接收数据 38 func chanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool) 39 // 关闭 channel 40 func closechan(c *hchan) 41 ``` 42 43 ### makechan 44 makechan 创建一个channel, 返回一个channel 的指针, *hchan 45