gpt4 book ai didi

go - 如何两次解锁互斥锁

转载 作者:行者123 更新时间:2023-12-03 01:29:59 24 4
gpt4 key购买 nike

两次解锁互斥体是否安全?我的代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com