ホームページ  >  記事  >  バックエンド開発  >  golang チャネルを閉じると goroutine の同期も強制されますか?

golang チャネルを閉じると goroutine の同期も強制されますか?

WBOY
WBOY転載
2024-02-09 20:15:31434ブラウズ

关闭 golang 通道是否也会强制 goroutine 同步?

php エディターの Xigua が、golang チャネルに関する質問に答えます。golang チャネルを閉じると goroutine の同期も強制されますか?通常、チャネルを閉じてもゴルーチンの同期は強制されませんが、チャネルを閉じるとチャネルに対する読み取り操作がトリガーされ、ゼロ値とブール値が返されます。チャネルに未読のデータがある場合、読み取り操作はデータと true を返します。チャネルに未読のデータがない場合、読み取り操作は 0 と false を返します。したがって、チャネルを閉じた後、チャネルを読み取ることで、チャネル内のすべてのデータが読み取られたかどうかを判断できます。

質問内容

書籍『Go プログラミング言語』(226 ページ)に記載されているとおり:

リーリー

チャンネルを閉じても同じことが起こりますか?つまり、チャネルを閉じる受信は、チャネルを閉じたゴルーチンが再び起動する前に常に行われるのでしょうか?

それに関連するものを読んだ記憶があります。本で探しましたが見つかりませんでした。

回避策

チャネルを閉じても、バッファリングされていないチャネルで送信する場合のように、ゴルーチンの同期は強制されません。

Go メモリ モデル仕様には次のように記載されています:

close() を呼び出す goroutine は、別の goroutine がゼロ値を受け取るのを待機することをブロックしません。

バッファリングされていないチャネルに値を送信する Goroutine は、別の Goroutine が値を受信するまでブロックされます。

以上がgolang チャネルを閉じると goroutine の同期も強制されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。