【发布时间】:2021-04-22 15:13:52
【问题描述】:
当我运行我的代码时会出现竞争条件。它是并发安全存储的简单实现。当我将 get() 方法中的接收者更改为 (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()
}
}
【问题讨论】:
-
什么机器/os/go版本?我试过8核/macos/go1.10;和16核/macos/go1.14;它似乎对那些工作正常。
-
linux, go1.16.3, 64bit
标签: go pointers struct race-condition