2 回答

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

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