[解決済み] Goチャンネルはどのように実装されるのですか?
質問
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) 自身によるものです。
関連
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Goで複数行の文字列はどのように書くのですか?
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
[解決済み】Goのタグはどのような用途に使われますか?
-
[解決済み] interface{}をint型に変換する
-
[解決済み] 単一値コンテキストにおける複数値
-
[解決済み] Goプロジェクトの賢明なレイアウト方法とは [終了しました]。
-
[解決済み] Goのコンパイル済み実行ファイルのサイズが巨大化する理由
-
[解決済み] 匿名インターフェイスを埋め込んだ構造体の意味?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] GolangでMkdirを使ってネストされたディレクトリを作成するには?
-
[解決済み] Goプロジェクトの賢明なレイアウト方法とは [終了しました]。
-
[解決済み] 複数のファイルからなるGoプログラムをコンパイルするには?
-
[解決済み] マップを含む値を順番に収集する
-
[解決済み] ...interface{}の意味 (ドット・ドット・ドット・インターフェース)
-
[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?
-
[解決済み] IntelliJでファイル保存時にgofmtを実行する
-
[解決済み] Goのintとint64の違いは何ですか?
-
[解決済み] 標準入力から整数を読み込む