golang——channel筆記

1.for i := range channel {緩存

  //...多線程

}spa

至關於 循環進行 i<-channel,直至close(channel)線程

 

2.code

· 給一個 nil channel 發送數據,形成永遠阻塞blog

· 從一個 nil channel 接收數據,形成永遠阻塞同步

· 給一個已經關閉的 channel 發送數據,引發 panicstring

· 從一個已經關閉的 channel 接收數據,當即返回一個零值it

 

3.一個多線程同步的例子class

 1 import "fmt"
 2 
 3 func push(c chan int, id string) {
 4     for i := 0; i < 10; i++ {
 5         c <- i
 6     }
 7     sync <- true
 8     fmt.Println(id)
 9 }
10 
11 var sync chan bool
12 
13 func main() {
14     sync = make(chan bool, 1)
15     ch := make(chan int, 20)
16     go push(ch, "A")
17     go push(ch, "B")
18     <-sync
19     <-sync
20     close(ch)//不關閉將致使deadlock
21     for j := range ch {
22         fmt.Println("parent:", j)
23     }
24 }

4.無緩存與有緩存channel:

 1 func main() {
 2     //ch = make(chan int, 1)//有緩衝
 3     //ch = make(chan int)//無緩衝
 4     select {
 5     case <-ch:
 6         print("A")
 7     case ch <- 1:
 8         print("B")//有緩衝輸出B
 9     default:
10         print("C")//無緩衝輸出C
11     }
12 }

我的認爲,無緩衝至關於有1個單位的緩衝這種說法欠佳,事實上無緩衝channel須要Read端和Write端均準備好才能發生RW操做,不然死鎖;

但Read一個nil的有緩衝channel依然會死鎖。

記住:channel是爲通訊而生的,你拿起電話不會是爲了跟本身說話

相關文章
相關標籤/搜索