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

时间:2018-03-01 10:39:25

标签: go mutex deferred

这种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设置为不同的值?

必须让Get()成为这样的东西吗?:

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

1 个答案:

答案 0 :(得分:4)

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

无需创建存储i.val的本地变量。