我有三个并发的 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 的代码中,您可以找到各种打印语句的输出,如下所示:process [number] 在 [time nano seconds] 发送 [int] to process [number] ]。但是,由于三个并发例程的结果,有时打印语句没有正确执行(意味着没有打印整个,有一些东西被另一个打印插入,例如进程 [number] 发送 [int] 到进程 [number] 处的进程 [number] ])。任何机构都可以帮我解决这个问题吗?