我有三个并发的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的print语句(*标记之间的语句)(尽管我的print语句只有一条)并给出死锁错误。谁能告诉我什么是错误的代码逻辑。谢谢。
NB。有关更多信息,可以在这里找到代码,http://play.golang.org/p/pW6aXryUaK,其中只有290行正在执行。没有错误的原始代码可以在这里找到play.golang.org/p/UL3rj8DJRk。我只是给它们加了锁和锁。谢谢。
我想补充一点:在play.golang.org/p/UL3rj8DJRk的代码中,您可以找到各种打印语句的输出,如:process [number]在[时间纳秒]向process [number]发送[int]。然而,由于三个并发例程的结果,有时打印语句没有正确执行(意味着没有打印整个,有一些东西被另一个打印插入,比如进程[number]将[int]发送到进程[number]的进程[number])。
无法确定死锁的原因,因为您发布的代码没有包含足够的信息。
它可能是由您获取锁的顺序引起的,也可能是由使用未缓冲的Go通道引起的。
在你发布完整的Go源代码之前,没有办法回答你的问题。
如果您需要讨论更长的代码,您可能应该将其发布到golang-nuts。