ホームページ > バックエンド開発 > Golang > Go のバッファリングされていないチャネルがデッドロックを引き起こすのはなぜですか?

Go のバッファリングされていないチャネルがデッドロックを引き起こすのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-21 17:31:11
オリジナル
186 人が閲覧しました

Why Do Unbuffered Channels in Go Cause Deadlocks?

ゴルーチンのバッファなしチャネルのデッドロック

Go の同時実行モデル内では、バッファなしチャネルは予期しないデッドロックを引き起こす可能性があります。この問題が発生する理由を詳しく調べ、別の解決策を検討してみましょう。

次のコード スニペットを考えてみましょう:

package main

import "fmt"

func main() {
    c := make(chan int)    
    c <- 1   
    fmt.Println(<-c)
}
ログイン後にコピー

このコードは、バッファリングされていないチャネルで単純な送受信操作を実行しているように見えます。ただし、実行すると次のエラーでデッドロックが発生します:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /home/tarrsalah/src/go/src/github.com/tarrsalah/tour.golang.org/65.go:8 +0x52
exit status 2
ログイン後にコピー

このデッドロックが発生する理由を理解するには、まずバッファリングされていないチャネルの動作を理解する必要があります。

バッファリングされていないチャネルの詳細

Go の公式ドキュメントに記載されているように、「チャネルがバッファされていない場合、送信者は受信者が値を受信するまでブロックします。チャネルにバッファがある場合、送信者はバッファがいっぱいの場合、値がバッファにコピーされるまでブロックします。これは、受信者が値を取得するまで待機することを意味します。値。"

簡単に言うと、

  1. バッファリングされていないチャネルは永続的に考慮されます。 full.
  2. バッファリングされていないチャネルにデータを送信すると、別の goroutine が値を取得するまで送信者がブロックされます。

デッドロック シナリオ

提供されたコード スニペットでは、チャネルがバッファリングされておらず、他にバッファリングされていないため、操作 c

デッドロックの解除

デッドロックを解決するには、次のいずれかを行うことができます。

  1. バッファリングされたチャネル: バッファリングされたチャネルを作成することによって (例: c := make(chan int, 1)) では、受信者の準備が整う前に送信者のゴルーチンが一時的に値を配置できる小さなバッファーを割り当てます。

OR

  1. a 受信ゴルーチン: チャネルからのデータの受信を処理するために別のゴルーチンを導入できます。これにより、コンシューマーはいつでも送信された値を取得できるようになります。

受信ゴルーチンの例:

package main

import "fmt"

func main() {
    c := make(chan int)    
    go func() {
        fmt.Println("received:", <-c)
    }()
    c <- 1   
}
ログイン後にコピー

ここでは、 go で作成されたゴルーチンを示します。 func() {...} はチャネルからの値の受信を継続的に待ちます。この受信ゴルーチンを導入することで、デッドロックが防止されます。

結論として、専用の受信メカニズムを持たずに同じゴルーチン内でバッファリングされていないチャネルを使用すると、デッドロックが発生する可能性があります。これを回避するには、バッファリングされたチャネルを使用するか、別個の受信ゴルーチンを導入して、同時ゴルーチン間で適切なデータ転送を確保することを検討してください。

以上がGo のバッファリングされていないチャネルがデッドロックを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート