繁体   English   中英

推迟进行互斥锁解锁时,您能否获得数据竞赛?

[英]Can you get a data race when deferring a mutex unlock in go?

这是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
}

您的代码是安全的,在评估return语句的表达式列表之后,将执行延迟函数。 如果您将命名结果参数 ,则在调用延迟函数之前,也将为它们分配返回值(甚至可以在从封装函数“真正”返回之前修改返回值)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM