【问题标题】:Deadlock Error in Mutually Concurrent Go Routines相互并发的 Go 例程中的死锁错误
【发布时间】:2012-01-11 04:51:36
【问题描述】:

我有三个并发的 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] send [int] to process [number ] 在 [时间纳秒]。但是,由于三个并发例程的结果,有时打印语句没有正确执行(意味着没有打印整个,有一些东西被另一个打印插入,例如进程 [number] 发送 [int] 到进程 [number] 处的进程 [number] ])。任何机构都可以帮我解决这个问题吗?

【问题讨论】:

    标签: go concurrent-programming goroutine


    【解决方案1】:

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

    可能是你获取锁的顺序造成的,也可能是使用了无缓冲的Go通道造成的。

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

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

    【讨论】:

    • 完整代码,您可以在play.golang.org/p/pW6aXryUaK 上找到,其中只有第 290 行正在执行。谢谢。
    • 再补充一点,没有错误的原代码可以在这里play.golang.org/p/UL3rj8DJRk找到。我只是给他们加锁和解锁。
    • @Arpssss:您的代码不是惯用的 Go 代码。这是一团糟。您无缘无故地使用锁和缓冲通道。将您的代码 (play.golang.org/p/pW6aXryUaK) 发布到 groups.google.com/group/golang-nuts - 希望 golang-nuts 的人会帮助您改进代码。
    • 感谢 Atom 的建议。但是,在原始帖子的伪代码中,是否有任何理由只执行多次打印语句?
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2017-06-24
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多