0

我有三个并发的 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] ])。任何机构都可以帮我解决这个问题吗?

4

1 回答 1

1

由于您发布的代码没有包含足够的信息,因此无法确定死锁的原因。

这可能是由于您获取锁的顺序引起的,也可能是由于使用了无缓冲的 Go 通道引起的。

在您发布完整的 Go 源代码之前,没有办法回答您的问题。

如果您需要更详细地讨论代码,您可能应该将其发布到golang-nuts

于 2011-12-02T08:41:40.787 回答