初識go的chan

chan

chan: 信道/管道
特點:緩衝大小爲零的時候,必須讀寫同步,否者程序會被阻塞(死鎖)
例子:
package main
import "fmt"
var ch chan int = make(chan int)
func cun() {
	ch <- 0 // 2⃣
}
func qu(){
    fmt.println(<-ch)
}
func main() {
	cun() // 1⃣
	qu() // 3⃣
}
這段代碼會阻塞,原因如下:
1⃣函數裏面有個2⃣
2⃣正在寸入,但是ch沒有緩衝大小了,存不進0這個值,於是阻塞了;必須等到取了才能寫入,或者改變ch的緩衝大小把0存入
3⃣是取ch,可是根本到不了這個地方,因爲1⃣步驟阻塞了;
死鎖:2⃣在等3⃣,可是3⃣又在等2⃣;

解決方案:
一,cun() 這一行改成: go cun() // 異步執行foo()
二,調換cun(), qu() 的執行;改成:
    go qu()
    cun()
注意,不能寫成如下兩個順序
    1) cun()
        go qu()
    2)  qu()
        go cun()
    // 因爲會在go 的上一步就阻塞了,go的作用函數壓根沒有執行到
三,聲明的時候增加一個緩衝大小,聲明改成:var ch chan int = make(chan int, 1)
    執行順序必須如下:
        cun()
        qu()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章