作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
两次解锁互斥体是否安全?我的代码:
var m sync.RWMutex = sync.RWMutex{}
func Read() {
m.RLock()
defer m.RUnlock()
// Do something that needs lock
err := SomeFunction1()
if err != nil {
return
}
m.RUnlock()
// Do something that does not need lock
SomeFunction2()
}
我需要defer m.RUnlock()
来应对SomeFunction1()
返回错误的情况。但是当 SomeFunction1()
返回且没有错误时,m
将被 m.RUnlock()
和 defer m.RUnlock( 解锁两次)
。
两次解锁互斥体是否安全?如果没有,我应该如何修复我的代码?
最佳答案
Is it safe for unlocking a mutex twice?
不,您不应该两次解锁互斥体。根据docs,这是一个运行时错误 .
<小时/>RUnlock undoes a single RLock call; it does not affect other simultaneous readers. It is a run-time error if rw is not locked for reading on entry to RUnlock.
If not, how should I fix my code?
我建议保留defer
,但仅保留m.RUnlock()
以防出现错误。如果您在 SomeFunction1()
和 SomeFunction2()
之间添加更多函数调用,这可以轻松扩展。
func Read() {
var err error
m.RLock()
defer func() {
if err != nil {
m.RUnlock()
}
}()
// Do something that needs lock
err = SomeFunction1()
if err != nil {
return
}
m.RUnlock()
// Do something that does not need lock
SomeFunction2()
}
试试 Go Playground !
关于go - 如何两次解锁互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701654/
我是一名优秀的程序员,十分优秀!