我有三个并发的go例程,如下所示,func Routine1() { mutex1.Lock() do something mutex2.Lock() mutex3.Lock() send int to routine 2 send int to routine 3 * Print Something * mutex2.Unlock() mutex3.Unlock() receive ints do something mutex2.Lock() mutex3.Lock() send int to routine 2 send int to routine 3 Print Something mutex2.Unlock() mutex3.Unlock() do something receive ints mutex1.Unlock() wg.Done()}func Routine2() { mutex2.Lock() do something mutex1.Lock() mutex3.Lock() send int to routine 1 send int to routine 3 Print Something mutex1.Unlock() mutex3.Unlock() do something receive ints mutex1.Lock() mutex3.Lock() send int to routine 1 send int to routine 3 Print Something mutex1.Unlock() mutex3.Unlock() do something receive ints mutex2.Unlock() wg.Done()}func Routine3() {// same structure as routine 1 & 2}func main() {wg.Add(3)go Routine1()go Routine2()Routine3()wg.Wait()}该逻辑代码每次都会出现死锁情况。实际上,当它运行时,只需多次执行例程1的打印语句(*标记之间的语句)(尽管我的打印语句只是一个),并给出死锁错误。有人可以告诉我代码逻辑有什么问题吗?谢谢。注意 有关更多信息,请参见http://play.golang.org/p/pW6aXryUaK,此处仅执行第290行。包含错误的原始代码可以在play.golang.org/p/UL3rj8DJRk中找到。我只是向他们添加锁定和解锁。谢谢。我想补充一点:在play.golang.org/p/UL3rj8DJRk代码中,您可以找到各种打印语句的输出,如下所示:进程[number]在[时间纳秒]上将[int]发送到[number]到进程[number] ]。但是,由于这三个并发例程的结果,有时print语句无法正确执行(意味着未完全打印,这是另一张打印插入的东西,例如进程[number]将[int]发送到进程[number]的进程[number] ])。有人可以帮我解决这个问题吗?
1 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
由于您发布的代码没有足够的信息,因此无法确定死锁的原因。
这可能是由于您获取锁的顺序引起的,也可能是由于使用了未缓冲的Go通道引起的。
在发布完整的Go源代码之前,您无法回答问题。
如果您需要讨论更长的代码,则可能应该将其发布到golang-nuts上。
- 1 回答
- 0 关注
- 215 浏览
添加回答
举报
0/150
提交
取消