相互并发围棋例程中的死锁错误



我有三个并发的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。

相关内容

  • 没有找到相关文章

最新更新