当我运行代码时,会发生争用条件。它是并发安全存储的简单实现。当我将 get() 方法中的接收方更改为 时,争用条件消失。我很困惑。我需要一个可以向我解释这样一个behaivior的人。(p *storageType)
package main
type storageType struct {
fc chan func()
value int
}
func newStorage() *storageType {
p := storageType{
fc: make(chan func()),
}
go p.run()
return &p
}
func (p storageType) run() {
for {
(<-p.fc)()
}
}
func (p *storageType) set(s int) {
p.fc <- func() {
p.value = s
}
}
func (p storageType) get() int {
res := make(chan int)
p.fc <- func() {
res <- p.value
}
return <-res
}
func main() {
storage := newStorage()
for i := 0; i < 1000; i++ {
go storage.set(i)
go storage.get()
}
}
翻翻过去那场雪
侃侃尔雅
相关分类