2017-01-25 18 views
2

私のプログラムがデッドロックしている状況にあり、これをデバッグして、バッファされていないチャンネルにいくつの要素があるかを知りたい場合、Go ?次のコードは、出力は私が(さらに、それはまた、私は理由を見つけることができない何かである、デッドロック)予想通り2バッファされていないチャンネルの要素数を取得する方法

package main 

import "fmt" 

func main() { 
    channel := make(chan string) 
    done_channel := make(chan bool) 
    go func() { 
     channel <- "value" 
     channel <- "value" 
     fmt.Println(len(channel)) 
     done_channel <- true 
    }() 
    variable := <- channel 
    fmt.Println(variable) 
    ok := <- done_channel 
    fmt.Println(ok) 
} 
+5

バッファされていないチャネルには要素が含まれていないため、バッファされません。 – JimB

+0

@JimB私はチャネル上で無限にブロックされている状況にあります。これをデバッグして、コードにステップインする際に要素がチャネルに送信されたように見えるため、チャネルに何かがあるかどうかを確認したい私はこれをどうお勧めしますか? – Curious

+0

@ JimBしかし、チャンネルから値を取るときは、永久にブロックする前に入れられた値の正確な数を得ることができるので、内部的にいくつかの値が格納されている必要がありますか? – Curious

答えて

3

のGoランタイムはあなただけで出会ったデッドロック検出器を持っていません。検出器は、問題を解決するために必要なすべての情報を提供しています。チャンネルの長さを分析する必要はありません。すべてのゴルーチンが眠っていると言っている

value 
fatal error: all goroutines are asleep - deadlock! 

goroutine 1 [chan receive]: 
main.main() 
    /home/grzesiek/test.go:16 +0x17e 

goroutine 5 [chan send]: 
main.main.func1(0xc42001a0c0, 0xc42001a120) 
    /home/grzesiek/test.go:10 +0x99 
created by main.main 
    /home/grzesiek/test.go:13 +0x9c 
exit status 2 

あなたのプログラムの出力で

見てみましょう(ブロック)と何ら進展は可能ではありません。ブロックされたゴルーチンは、ブロッキング操作とブロッキングを引き起こした行と一緒にリストされています。

ゴルーチン1(メイン)ライン10にそれをchannelチャネルへの書き込みしようとしている(関数呼び出しオペレータ()によってライン13で作成した)線16

ゴルーチン5にチャネルdone_channelから読み出さしようとしていますシャネルの反対側にゴルーチンがないので、さらに進まないでしょう。したがって、done_channelには書き込まれません。

goroutineがさらに進むことができず、メインのゴルーチンもブロックされているため、プログラムがブロックされています。

メインプログラムが終了するとGoプログラムが終了するので、done_channelから読み取ろうとしない場合、このデッドロックは発生しません。

関連する問題