オリジナル: https://www.jianshu.com/p/147bd63801b6
--------------------------------------
他の言語とは違って行く、それは同時言語レベルからのサポートを持って、我々は、新しいスレッドのスレッドライブラリに依存する必要はありません。私たちは、セキュリティロックと同時実行の問題に多くの思考を与えないように、チャネルメカニズムに移動します。チャネルの一種間ゴルーチンは、データストリームを送信する方法を提供します。
今日、私は、一般的なデッドロックエラーから開始チャネルの特性を議論したいです。
場合は、次の手順を実行します。
var ch = make(chan int)
func main() { ch <- 1 <-ch // 没有这行代码也会报同样的错误 }
ターミナルには、次のエラーを報告します。
fatal error: all goroutines are asleep - deadlock!
リコールチャネル(チャネル)の概念は、一般的に言えば、各チャネルは、ゴルーチン循環チャネルデータとの間の通信導管はゴルーチン間の共有メモリを表しています。マクロの観点から、キュー(待ち行列)の他の言語のようなチャネルビットは、FIFOルールに従ってください。
バッファリングされていないチャネルにチャネル(すなわち、バッファリングされていないチャネル)とチャネルバッファ(緩衝チャンネル)。バッファリングされていないチャンネルのために、我々は、チャネルメッセージ(送信)メッセージをデフォルト、および受信(受信)(ブロック)Aブロックされています。すなわち、バッファリングされていないチャネル受信されたメッセージ及びメッセージに、ゴルーチンはであるサスペンド状態。もう一方の端の準備ができていない限り、それ以外のゴルーチンは実装を下に継続することはできません。
プログラムのその部分の上に明白な誤りサンプルです。メイン関数で実行されるCH < - (もゴルーチン)1が既に保留されている主が、メッセージを受信するための責任のない他のゴルーチン、そして次の文<-CH実行されないが、システムは自動的にタイムアウトエラー文が返されたとき。このすべてのスレッドまたはプロセスがリソースの解放を待っている、我々はそれがデッドロックと呼ばれて置きます。
デッドロックは、一般的なデッドロックが広く分類、非常に興味深いトピックです
。私はシングルチャネルゴルーチン、上記の例でのみ動作します。
。ハングチャネル間IIシリーズは、例えば次のように
var ch1 chan int = make(chan int) var ch2 chan int = make(chan int) func say(s string) { fmt.Println(s) ch1 <- <- ch2 // ch1 等待 ch2流出的数据 } func main() { go say("hello") <- ch1 // 堵塞主线 }
CH1 CH2さておきデータを待っているが、データがCH2ゴルーチン原因の障害物を発行していない、CH2ソリューションは、データを供給することです。
func feedCh2(ch chan int) { ch <- 2 }
III。バッファなしの不対チャンネルが表示されます。
c, quit := make(chan int), make(chan int) go func() { c <- 1 // c通道的数据没有被其他goroutine读取走,堵塞当前goroutine quit <- 0 // quit始终没有办法写入数据 }() <- quit // quit 等待数据的写
もちろん、すべての不対チャネルがバッファリングされていないが与えられている表示されません。
func say(ch chan int) { ch <- 1 } func main() { ch := make(chan int) go say(ch) }
関数はチャネル受信メッセージを言う待つために一時停止が、主なゴルーチンがブロックされていないが、興味深いことに、プログラムが自動的にまだメイン関数から戻った後に終了することができます。
バッファリングチャネルは、後の記事で紹介されますについては、すべてのコメントがアドバイスしてください。
著者:Solonk8
リンクします。https://www.jianshu.com/p/147bd63801b6
出典:ジェーン・ブック
著者によって予約ジェーンブックの著作権は、いかなる形で再現され、承認を得るために作者に連絡して、ソースを明記してください。