在Go中解决重复的互斥锁

时间:2015-10-22 16:21:01

标签: multithreading go mutex

我在Go程序中有许多函数,它们在一个结构上工作,该结构使用互斥锁来管理对其函数的并发访问。

其中一些操作特定数据的函数需要锁定,从而使用mutex.Lock()来获取管理对该数据的访问的互斥锁。今天我遇到了一个问题,其中两个锁定方法相互调用。当第二次调用mutex.Lock()时,它会被阻止 - 当然。

我遇到的问题与此代码非常相似:http://play.golang.org/p/rPARZsordI

Go中是否有最佳实践如何解决此问题?据我所知,Go中没有递归锁。

1 个答案:

答案 0 :(得分:1)

这似乎是您系统的设计缺陷。您应该将您需要锁定和解锁的部分分解出来。例如。如果你做的是

func (t *Thing) A() { t.Lock(); defer t.Unlock(); t.foo(); t.B() }
func (t *Thing) B() { t.Lock(); defer t.Unlock(); t.bar() }

那么你应该做的是

func (t *Thing) A() { t.Lock(); defer t.Unlock(); t.foo(); t.b() }
func (t *Thing) B() { t.Lock(); defer t.Unlock(); t.b() }
func (t *Thing) b() { t.bar() }