2017-10-14 14 views
0

ここは私の主な機能の本体です。初心者レベルのコードでデッドロック

c := make(chan int) 

go func() { 

    i := <-c 
    i++ 
    time.Sleep(100 * time.Millisecond) 

    c <-i 


}() 

time.Sleep(1 * time.Second) 
go func() { 
    i := <-c 
    i++ 
    time.Sleep(100 * time.Millisecond) 
    c <-i 

}() 

time.Sleep(1 * time.Second) 
fmt.Println(<-c) 

私はdeadgroup error.evenを取得しています。私はwaitgroups.hellaで試してみました。

答えを説明することは私にとっては素晴らしいことです。

+2

'c'に何も書き込まないので、3つのスレッドはすべてロックされています。 – zerkms

+0

printlnの前に "c < - 0"を追加しましたが、それは動作しますが、最初にfuncに行く前に追加すると、同じデッドロックエラーが発生しました。 –

+0

@ KadirSusuz最初のゴルーチンを作成する前に書き込み操作を追加すると、バッファされていないチャンネルに書き込もうとしています。この操作は、値がチャネルから読み取られるまでブロックされますが、読み込みを開始するためのゴルーチンは開始していません。解決策は、最初にゴルーチンを開始するか、バッファされたチャネルを作成することです。 – Gavin

答えて

0

は、最後の行の前に追加します。最後の行(チャンネルに送信)が印刷ゴルーチン番号と値を追加する前にも、あなたは両方のゴルーチンに追加することができます。

fmt.Println("goroutine 1 value", i) 

をこのあなたは値がチャネル内の同じ項目の3つの可能な消費者の状況に渡されるかを確認することができます。ほとんどの場合、メインのゴルーチンはチャンネルを読み、0となります。他の人にチャンスを与えるためにSleepを追加してください。睡眠時間と一緒に遊んで別の結果を得る。

+0

printlnの前に "c < - 0"を追加しましたが、それは動作しますが、最初にfuncに行く前に追加すると、同じデッドロックエラーが発生しました。 –

+0

かなりの権利 - その瞬間にチャンネルから読むことができるゴルーチンがないので。誰かがチャンネルからの読み上げを始めるまで、チャンネルへの書き込みはブロックされます。始める読者の間に書いてみてください。もう1つの方法:チャネルをバッファに入れることができます。つまり、内部に複数の要素を格納することができます。ルールは同じです:新しい要素のための部屋があればチャンネルに書き込むことができます。部屋の作家がブロックされていない場合は書き留めます。もし読者があれば、それは要素を読み込み、新しいもののための空き領域を読み込みます。バッファリングされたチャネルを作成するには? 'make(chan int、10)' - ここでは10 buf len –

1

チャットに書き込む前にチャンネルから読んでいるので、すべてがデッドロックして読んでも起こり得ないことがあります。

Printfの呼び出しの前にc <- 0を置くことによってデッドロックを解除できますが、プログラムは0,1,2を印刷できます。最初のゴルーチンを開始する前に、同じ問題が発生することに注意してください他のdirecionから、可能な読み取りのないsend。

あなたがしていることを言ったなら、私は本当に具体的な指針を提供することはできませんので、助けがはるかに簡単です。あなたが作業を開始するためにゴルーチンで読み取ることができ、開始値を与える

c <- 0 

この方法:

+0

"0がはるかに高い可能性があります。 ---それも私が思ったことだけど、それはplay.golangで2です。単一のcpuマシンでは、2がより可能性があります。 – zerkms

+0

最初の送信を正確に入れて、寝る場所が単一のコアマシンの主な影響になるのですが、現在はシングルコアマシンを実行していますか? :P最初の送信直後にスリープ状態になると、複数のコアで状況がかなり予測できなくなります。 –

+0

printlnの前に "c < - 0"を追加しましたが、それは動作しますが、最初にfuncを実行する前に追加すると、同じデッドロックエラーが発生しました。 –

0

あなたは無作為のチャンネルを手に入れました。つまり、無作為のチャンネルを使用しているときに、ライターとリーダーが何かを達成するためにバッファリングされたチャンネルを試す必要があります。 2バッファされていないチャンネルから書き込みを行う前に読み込みを行っています。書き込みが行われるまでブロックされます。ブロックされたチャンネルから2人の読者がいます(ライターがいないため)。