1

由于死锁,我有以下最小示例在第一个命令行输入后退出:

package main     

import "fmt"     
import "os"     

func main() {     
    channel1 := make(chan string)     

    go func() {     
        var str string     
        for {              
            fmt.Fscanln(os.Stdin, &str)     
            channel1 <- str                
        }                      
    }()      

    for {     
        select {     
        case str := <-channel1:     
            fmt.Printf("Channel1 said: %v\n", str)     
        }                                             
    }             
}  

我本来希望这只是简单地接受用户输入并一遍又一遍地回显它。此外,我确实注意到,如果我添加第二个通道和第二个 go 例程,它不会出现任何死锁问题。那么为什么会出现这种僵局呢?

4

1 回答 1

1

无法重现问题。

jnml@fsc-r630:~/src/tmp/SO/13015469$ cat main.go 
package main

import (
    "fmt"
    "os"
)

func main() {
    channel1 := make(chan string)

    go func() {
        var str string
        for {
            fmt.Fscanln(os.Stdin, &str)
            channel1 <- str
        }
    }()

    for {
        select {
        case str := <-channel1:
            fmt.Printf("Channel1 said: %v\n", str)
        }
    }
}
jnml@fsc-r630:~/src/tmp/SO/13015469$ go run main.go
foo
Channel1 said: foo
bar
Channel1 said: bar
baz
Channel1 said: baz
^Cjnml@fsc-r630:~/src/tmp/SO/13015469$ go build main.go && ./main 
foo
Channel1 said: foo
bar
Channel1 said: bar
baz
Channel1 said: baz
^Cjnml@fsc-r630:~/src/tmp/SO/13015469$ go version
go version go1.0.3
jnml@fsc-r630:~/src/tmp/SO/13015469$ uname -a
Linux fsc-r630 3.2.0-32-generic #51-Ubuntu SMP Wed Sep 26 21:33:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
jnml@fsc-r630:~/src/tmp/SO/13015469$ 

你的 Go 版本、操作系统和架构是什么?

于 2012-10-22T16:30:11.167 回答