multithreading - 解决 Go 中的重复互斥锁

标签 multithreading go mutex

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

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

我面临的问题与这段代码非常相似:http://play.golang.org/p/rPARZsordI

Go 中是否有关于如何解决此问题的最佳实践?据我所知,递归锁在 Go 中不可用。

最佳答案

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

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() }

关于multithreading - 解决 Go 中的重复互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33285808/

相关文章:

java - Java 如何发送并行 POST 请求

string - 子字符串和 Go 垃圾收集器

c++ - 互斥作为类成员

linux - ARM 平台上 Linux 内核(3.5.2 之前)的 Mutex 实现

C++:防止多个函数同时执行

c++ - 为套接字轮询/选择设置超时值的最佳做法是什么?

python - "Can' t 开始一个新的线程错误”在 Python 中

go - go 程序中的一般 panic recover

c - 进程在不应运行的线程中崩溃

Golang 生成带扩展名的唯一文件名