gpt4 book ai didi

go - 为什么我会遇到此 Golang 代码的死锁?

转载 作者:IT王子 更新时间:2023-10-29 00:40:05 25 4
gpt4 key购买 nike

我对 Golang 很陌生。我写了下面的代码练习,遇到了死锁的运行时错误信息:

package main

import (
"fmt"
)

func system(WORKERS int) {
fromW := make(chan bool)
toW := make(chan bool)
for i := 0; i != WORKERS; i++ {
go worker(toW, fromW)
}
coordinator(WORKERS, fromW, toW)
}

func coordinator(WORKERS int, in, out chan bool) {
result := true
for i := 0; i != WORKERS; i++ {
result = result && <-in
}
for i := 0; i != WORKERS; i++ {
out <- result
}
fmt.Println("%t", result)
}

func worker(in, out chan bool) {
out <- false
<-in
}

func main() {
system(2)
}

但是,如果我将第 19 行中 && 的操作数交换为

result =  <-in && result,

代码工作正常,没有返回任何错误信息。我该如何解释这种行为?我在这里错过了什么吗?我使用的操作系统是Windows 10,Golang版本是1.8.3。

非常感谢您。

最佳答案

如你所见here , && 的右操作数有条件地评估。

这意味着result = result && <-in只会评估 <-in如果result是真的。所以,coordrinator 只读取一个 false从该 channel ,并跳过阅读来自其他工作人员的消息。如果切换 && 的操作数地方,然后是<-in每次都会评估,死锁就会消失。

关于go - 为什么我会遇到此 Golang 代码的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811933/

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