1. ホーム
  2. go

[解決済み] Goチャンネルはどのように実装されるのですか?

2023-04-21 12:36:21

質問

Go言語仕様、効果的なGo、およびGoメモリモデルを(簡単に)確認した後、Goチャンネルがボンネットの下でどのように動作するかについて、まだ少し不明です。

チャネルはどのような構造なのでしょうか? スレッドセーフなキュー/配列のようなものです。

実装はアーキテクチャに依存するのでしょうか?

どのように解決するのですか?

チャンネル用のソースファイルは、(go のソースコードのルートから)次の場所にあります。 /src/pkg/runtime/chan.go にあります。 .

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

チャンネル操作はすべてこのchan.goファイルに実装されているので、makechan、send、receive操作や、select construct、close、len、capなどのビルトインを見ることができます。

チャネルの内部構造に関する詳細な説明については、次の本を読んでください。 ステロイドでGoチャンネル Dmitry Vyukov (Go core dev, goroutines, scheduler and channels among other things) 自身によるものです。