有一個緩存位置的通道,在被接收數據之前也是阻塞的嗎?
package main
import (
? ? "fmt"
)
func main() {
? ? ch := make(chan int 1)
? ? ? ?go func() {
? ? ? ? fmt.Println("1")
? ? ? ? ch <- 1
? ? }()
? ? <-ch
? ? go func() {
? ? ? ?fmt.Println("2")
? ? ? ? ch <- 1
? ? }()
? ? <-ch
? ? go func() {
? ? ? ? fmt.Println("3")
? ? ? ? ch <- 1
? ? }()
? ? <-ch
}
把上面的1個緩存通道去掉,改成非緩存通道,程序還是可以執行的。請問有一個緩存位置的通道,在被接收數據之前也是和非緩存通道一樣,是阻塞的嗎?
2019-04-08
這里的‘在被接受數據之前’指的是ch<-1存數據吧。
緩沖的channel:保證往緩沖中存數據先于對應的取數據,簡單說就是在取的時候里面肯定有數據,否則就因取不到而阻塞。所以緩沖的channel可能在取數據的時候發生阻塞。
非緩沖的channel:保證取數據先于存數據,就是保證存的時候肯定有其他的goroutine在取,否則就因放不進去而阻塞。所以非緩沖的channel可能在存數據的時候會發生阻塞。