gpt4 book ai didi

go - 相互并发的 Go 例程中的死锁错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:17:58 24 4
gpt4 key购买 nike

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

最佳答案

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

可能是你获取锁的顺序导致的,也可能是使用了无缓冲的Go channel 导致的。

除非您发布完整的 Go 源代码,否则无法回答您的问题。

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

关于go - 相互并发的 Go 例程中的死锁错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com