亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 內存模型發生在之前(具有共享狀態的通道)

Go 內存模型發生在之前(具有共享狀態的通道)

Go
POPMUISE 2023-07-26 17:18:19
我試圖更全面地理解通道和其他共享狀態之間發生之前關系的本質。具體來說,我想看看是否在通道發送和接收操作上創建了某種內存圍欄。例如,如果我在通道上發送消息,則圍繞共享狀態修改的所有其他操作都“發生在”發送/接收操作之前。在我的特定示例中,我只從單個 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 以避免競爭。



查看完整回答
反對 回復 2023-07-26
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號