2 回答

TA貢獻1817條經驗 獲得超6個贊
goroutine 可以阻止等待通道準備好發送或接收,但通道本身永遠不會處于“阻塞”狀態。
第一個程序不會死機,因為 main 函數執行到最后并終止程序。
同一 go-routine 能否在寫入通道后執行通道讀取操作?
否,如果通道未緩沖(默認值)。對于無緩沖信道,發送 goroutine 會阻塞,直到接收 goroutine 準備就緒。
單個 goroutine 不能同時執行發送和接收。如果只有一個 goroutine 發送到通道,則 goroutine 會永遠阻塞。
如果某個通道被阻塞,其他 go-routine 還能向它發送消息嗎?
goroutine 可以在通道關閉之前的任何時間將值發送到通道。Goroutine 可以阻止等待通道準備好發送。
如果 go-routine 嘗試將消息發送到被阻止的通道,會發生什么情況?它會通過錯誤,還是什么也沒發生,或者?
Goroutine可以阻止等待頻道準備就緒。通道本身未處于阻塞狀態。

TA貢獻1934條經驗 獲得超2個贊
通道不會“阻塞”。通道上的讀取或寫入操作可能會阻塞。
對于無緩沖通道(這是您上面的內容):寫入操作將阻止寫入 goroutine,直到另一個 goroutine 準備好從該通道讀取。當讀取 goroutine 準備好讀取(即執行 <-ch)時,則寫入和讀取發生,并且兩個 goroutine 繼續運行。
對于緩沖通道:只要通道緩沖區未滿,寫入操作就不會阻塞。同樣,如果有要從通道讀取的內容,則讀取不會阻塞。
至于你的問題:
如果所討論的通道未緩沖,則寫入操作將阻塞,因為只有當另一個 goroutine 正在從該通道讀取時,寫入操作才能繼續。因此,goroutine不會進展為從通道讀取。如果這是一個緩沖通道,并且通道未滿,則相同的 goroutine 可以寫入該通道并從中讀取。
如果一個 goroutine 正在等待寫入一個通道,而另一個 goroutine 來寫入它,它也會阻塞,直到另一個 goroutine 從通道讀取。
如果 goroutine 嘗試寫入已滿的通道,它將阻塞,直到另一個 goroutine 可以從該通道讀取。
- 2 回答
- 0 關注
- 86 瀏覽
添加回答
舉報