2 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
通道操作是 goroutine 安全的。你可以在任何 goroutine 中讀/寫/關(guān)閉,而不會(huì)破壞任何進(jìn)出通道的東西?;旧?,通道是同步點(diǎn)。無(wú)緩沖通道(如您的情況)將在每次寫入和讀取時(shí)阻塞。當(dāng)您編寫代碼時(shí),您的代碼會(huì)阻塞并等待有人開(kāi)始在另一端閱讀。當(dāng)您閱讀您的代碼時(shí),您的代碼會(huì)阻塞并等待有人開(kāi)始在另一端編寫。
在您的情況下,goroutines 中的計(jì)算將同時(shí)完成(不需要并行),但會(huì)在通道寫入時(shí)阻塞。您的主要 goroutine 將在第一次讀取時(shí)阻塞,讀取值。在第二次讀取時(shí)阻塞,讀取值。
即使您使用緩沖通道 - c := make(chan int, 2)
. 您的 goroutine 將完成計(jì)算,將結(jié)果寫入通道而不阻塞并終止。什么都不會(huì)被破壞。與此同時(shí),主 goroutine 將阻塞通道讀取并等待有人寫入它。
我建議你閱讀Effective go , Go Concurrency Patterns并嘗試A Tour of Go

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
確實(shí),當(dāng)您從兩個(gè)不同的 goroutine 通過(guò)一個(gè)通道發(fā)送兩個(gè)值時(shí),不一定保證排序(除非您已經(jīng)做了其他事情來(lái)協(xié)調(diào)它們的發(fā)送)。
但是,在此示例中,排序根本無(wú)關(guān)緊要。通道上正在發(fā)送兩個(gè)值:前半部分的總和和第二部分的總和。
go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c)
由于這兩個(gè)值唯一用于計(jì)算總和,因此順序根本無(wú)關(guān)緊要。事實(shí)上,如果您運(yùn)行該示例的次數(shù)足夠多,您應(yīng)該會(huì)看到它x
并且y
經(jīng)常被交換,但總和x+y
始終相同。
- 2 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報(bào)