[英]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.