【发布时间】:2015-05-30 15:27:39
【问题描述】:
var mu sync.RWMutex
go func() {
mu.RLock()
defer mu.RUnlock()
mu.RLock() // In my real scenario this second lock happened in a nested function.
defer mu.RUnlock()
// More code.
}()
mu.Lock()
mu.Unlock() // The goroutine above still hangs.
如果一个函数读锁定了一个读/写互斥锁两次,而另一个函数写锁然后写-un锁定了同一个互斥锁,原来的函数仍然挂起。
这是为什么呢?是不是因为互斥体允许代码执行的顺序是串行的?
我刚刚通过删除第二个 mu.RLock() 行解决了这样的场景(我花了几个小时才确定)。
【问题讨论】:
-
此代码是否始终如一地为您重现问题?我不能让它挂起来。
标签: concurrency go mutex