我試圖更全面地理解通道和其他共享狀態之間發生之前關系的本質。具體來說,我想看看是否在通道發送和接收操作上創建了某種內存圍欄。例如,如果我在通道上發送消息,則圍繞共享狀態修改的所有其他操作都“發生在”發送/接收操作之前。在我的特定示例中,我只從單個 go 例程寫入,然后從單個 go 例程讀取。(旁白:下面示例中明顯的答案是直接將結構體的實例放在Person通道上,但這不是我要問的。)package mainfunc main() { channel := make(chan int, 128) go func() { person := &sharedState[0] person.Name = "Hello, World!" channel <- 0 }() index := <-channel person := sharedState[index] if person.Name != "Hello, World!" { // unintended race condition }}type Person struct{ Name string }var sharedState = make([]Person, 1024)
1 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
內存模型保證當通道寫操作執行時,該 goroutine 中在通道操作之前的所有操作都是可見的。因此,在您的示例中,“意外的競爭條件”不會發生,因為當讀取通道時,goroutine 中發生的分配是可見的。當然,這是假設沒有另一個 goroutine 正在寫入同一個變量。如果有另一個 goroutine 寫入同一個變量,那么您也需要同步該 goroutine 以避免競爭。
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消