web-dev-qa-db-ja.com

Goチャネルはどのように実装されますか?

Go言語の仕様、効果的なGo、およびGoのメモリモデルを(簡単に)確認した後、Goチャネルが内部でどのように機能するかについては、まだはっきりしていません。

それらはどのような構造ですか?それらは、スレッドセーフなキュー/配列のようなものです。

それらの実装はアーキテクチャに依存していますか?

65
Matt

チャネルのソースファイルは / src/pkg/runtime/chan.go の(goソースコードルートから)です。

hchan は、チャネルの中心的なデータ構造であり、送受信リンクリスト(ゴルーチンとデータ要素へのポインタを保持)とclosedフラグを備えています。 runtime2.goで定義され、OSに応じてミューテックス(futex)またはセマフォとして機能するLock埋め込み構造があります。ロックの実装は、ビルドタグに基づいて、lock_futex.go(Linux/Dragonfly/Some BSD)またはlock_sema.go(Windows/OSX/Plan9/Some BSD)にあります。

チャネル操作はすべてこのchan.goファイルに実装されているため、makechan、送信操作、受信操作、および組み込みの選択構成、クローズ、レン、キャップを確認できます。

チャンネルの内部の仕組みについての詳細な説明については、 ステロイドのGoチャンネル をDmitry Vyukov自身(Go core dev、goroutines、scheduler、channelsなど)で読む必要があります。

71
mna

以下は、チャネルがどのように実装されるかを大まかに説明する良い講演です。
https://youtu.be/KBZlN0izeiY

トークの説明:

GopherCon 2017:Kavya Joshi-チャンネルを理解する

チャネルは、ゴルーチンが通信するためのシンプルなメカニズムと、高度な同時実行パターンを構築するための強力な構造を提供します。ランタイムスケジューラとメモリ管理システムによるチャネルのサポート方法を含め、チャネルとチャネル操作の内部動作について詳しく説明します。

2
ayke