2013-10-27 7 views
40

Go言語の仕様、効果的なGo、Goメモリモデルを(簡単に)見直しても、Goチャネルがどのように機能するかはまだ分かりません。Goチャネルはどのように実装されていますか?

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

実装はアーキテクチャによって異なりますか?

答えて

56

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

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

チャネル操作はすべてこのchan.goファイルに実装されています。したがって、makechan、sendおよびreceive操作、select構文、close、lenおよびcap組み込み関数を見ることができます。

チャネルの内部動作についての詳細な説明は、ドミトリーVyukov自身(Goコア開発者、goroutines、スケジューラ、チャネルなど)によってGo channels on steroidsを読む必要があります。

関連する問題