为什么 mutex.Lock() 在下面的代码中不起作用?每次我进行比赛测试时,它都会显示有比赛。
我尝试在子结构中使用锁,然后在父结构中使用锁来锁定状态,但它们都不起作用。 竞争测试一直说存在竞争条件。
我已经尝试过 t.Lock()
和 t.data.Lock()
。
type Test struct {
name string
data Data
sync.RWMutex //Should I put it here?
}
type Data struct {
d map[string]int
sync.RWMutex // Should I put it here?
}
func (t *Test) add(key string) {
t.data.Lock()
defer t.data.Unlock()
t.data.d[key] += 1
}
func (t *Test) read() {
for {
t.data.Lock()
_= t.data.d["test"]
t.data.Unlock()
}
}
func main() {
t := &Test{}
t.name = "oops"
t.data = Data{}
t.data.d = make(map[string]int)
t.data.d["test"] = 1
for i := 0; i <= 10; i++ {
go func(t *Test) {
t.add("test")
}(t)
go func(t *Test) {
t.read()
}(t)
}
time.Sleep(time.Second * 3)
fmt.Printf("result is %v", t.data.d["test"])
最佳答案
The race test keeps saying there is race condition.
声明
fmt.Printf("result is %v", t.data.d["test"])
传递参数
t.data.d["test"]
按值(value)。它通过分配创建一个副本,即读取。
您需要通过互斥体保护读取。
t.data.Lock()
fmt.Printf("result is %v\n", t.data.d["test"])
t.data.Unlock()
关于go - 即使使用互斥锁,打印结构字段时也会出现竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646440/