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

私はこれが単にユーザー入力を受け取り、それを何度も何度もエコーすることを期待していました。また、2番目のチャネルと2番目の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のバージョン、OS、アーキテクチャは何ですか?

于 2012-10-22T16:30:11.167 に答える