为什么我用这个Golang代码遇到死锁?

时间:2017-08-22 07:54:45

标签: go deadlock

我对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)
}

但是,如果我交换&amp;&amp;的操作数在第19行有

result =  <-in && result,

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

非常感谢你。

1 个答案:

答案 0 :(得分:6)

如您所见[{3}},&&的右操作数会有条件地进行评估。

这意味着result = result && <-in仅在<-in为真时评估result。因此,coodrinator只从该通道中读取一个false,并跳过从其他工作者那里读取消息。如果你切换&&个地方的操作数,那么<-in每次都会评估并且死锁就会消失。