在推迟互联网解锁时你能获得数据竞争吗?

问题描述 投票:1回答:1

这种Get方法是否有缺陷并容易出现理论数据竞争?

type item struct {
    val   int
    mutex sync.RWMutex
}

func (i *item) Set(val int) {
    i.mutex.Lock()
    defer i.mutex.Unlock()
    i.val = val
}

func (i *item) Get() int {
    i.mutex.RLock()
    defer i.mutex.RUnlock()
    return i.val
}

我问,因为我在使用-race和前代码运行我的测试时看到了罕见的数据竞争,但是找不到任何重复效果的方法。

是否可以在延迟执行RUnlock和从结构中读取并返回值之间将i.val设置为不同的值?

必须得到()这样的东西吗?:

func (i *item) Get() int {
    i.mutex.RLock()
    defer i.mutex.RUnlock()
    val := i.val
    return val
}
go mutex deferred
1个回答
4
投票

您的代码是安全的,在评估return语句的表达式列表之后执行延迟函数。如果你有named result parameters,那么在调用延迟函数之前也会为它们分配返回值(你甚至可以在从“封闭函数”返回“真正”之前修改返回值)。

无需创建局部变量来存储i.val

© www.soinside.com 2019 - 2024. All rights reserved.