我试图更全面地理解通道和其他共享状态之间发生之前关系的本质。具体来说,我想看看是否在通道发送和接收操作上创建了某种内存围栏。
例如,如果我在通道上发送消息,则围绕共享状态修改的所有其他操作都“发生在”发送/接收操作之前。在我的特定示例中,我只从单个 go 例程写入,然后从单个 go 例程读取。
(旁白:下面示例中明显的答案是直接将结构体的实例放在Person通道上,但这不是我要问的。)
package main
func 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)
噜噜哒
相关分类