我試圖更全面地理解通道和其他共享狀態(tài)之間發(fā)生之前關(guān)系的本質(zhì)。具體來說,我想看看是否在通道發(fā)送和接收操作上創(chuàng)建了某種內(nèi)存圍欄。例如,如果我在通道上發(fā)送消息,則圍繞共享狀態(tài)修改的所有其他操作都“發(fā)生在”發(fā)送/接收操作之前。在我的特定示例中,我只從單個 go 例程寫入,然后從單個 go 例程讀取。(旁白:下面示例中明顯的答案是直接將結(jié)構(gòu)體的實例放在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貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊
內(nèi)存模型保證當(dāng)通道寫操作執(zhí)行時,該 goroutine 中在通道操作之前的所有操作都是可見的。因此,在您的示例中,“意外的競爭條件”不會發(fā)生,因為當(dāng)讀取通道時,goroutine 中發(fā)生的分配是可見的。當(dāng)然,這是假設(shè)沒有另一個 goroutine 正在寫入同一個變量。如果有另一個 goroutine 寫入同一個變量,那么您也需要同步該 goroutine 以避免競爭。
- 1 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報
0/150
提交
取消