コンピューティングにおいて、チャネルは、メッセージ パッシングによるプロセス間通信および同期のモデルです。メッセージはチャネルを介して送信され、別のプロセスまたはスレッドは、参照を持つチャネルを介して送信されたメッセージをストリームとして受信できます。チャネルのさまざまな実装は、バッファリングされる場合とされない場合があり、同期または非同期のいずれかになります。
libthread チャネル
マルチスレッドライブラリlibthread は、オペレーティング システムPlan 9用に最初に作成され、固定サイズのチャネルに基づくスレッド間通信を提供します。
OCaml イベント
OCamlイベント モジュールは、同期用の型付きチャネルを提供します。モジュールの送信関数と受信関数が呼び出されると、同期可能な対応する送信イベントと受信イベントが作成されます。
例
ルアラブ2D
Luaプログラミング言語を使用するLove2D ライブラリは、スタックに似たプッシュおよびポップ操作を備えたチャネルを実装します。ポップ操作は、スタックにデータがある限りブロックされます。デマンド操作はポップと同じですが、スタックにデータがあるまでブロックされます。
-- loadstring() などの関数によって解釈されるコードを含む文字列です
が、C 側ではネイティブ スレッドを開始します。
ローカル スレッドコード = [[
love.thread.getChannel("test"):push("Hello world!")
]]
function love . load ()
-- スレッドを開始します。
スレッド = love.thread.newThread ( threadCode )スレッド: start ( )
-- スレッドは、チャネル テストのスタックから「Hello world!」がポップされるまでブロックされます。
-- スレッドが最初に実行される前にチャネルがポップされる可能性があるため、スタックにデータが存在しない可能性があります。
-- その場合は、:demand() ではなく :pop() を使用します。:demand() は、スタックにデータが存在するまでブロックし、その後データを返します。
印刷( love . thread . getChannel ( "test" ): demand ())
-- スレッドはこれで終了です。
終了
XMOS の
XMOSプログラミング言語XCは、チャネルからデータを送受信するためのプリミティブ型「Chan」と2つの演算子「<:」と「:>」を提供します。[1]
この例では、XMOS で 2 つのハードウェア スレッドが開始され、「par」ブロックの 2 つの行が実行されます。最初の行はチャネルを介して数値 42 を送信し、2 番目の行はそれが受信されるまで待機し、x の値を設定します。XC 言語では、select ステートメントを使用してチャネルで非同期受信することもできます。
ちゃんC ; int x ;パー{ c <: 42 ; c :> x ; }
行く
このGoコードのスニペットは、XC コードと同様に動作します。最初にチャネル c が作成され、次に goroutine が生成され、チャネルを介して 42 を送信します。数値がチャネルに入れられると、x は 42 に設定されます。Go では、チャネルがコンテンツをバッファリングできるほか、select ブロックを使用して非ブロッキング受信もできます。[2]
c := make ( chan int )
関数() { c <- 42 }()を実行する
x := <- c
さび
RustはSenderスレッド間の通信に非同期チャネルを提供します。チャネルは2つのエンドポイント(と)間の一方向の情報の流れを可能にしますReceiver。[3]
std :: sync :: mpscを使用します。std :: thread を使用します。
fn main () { let ( tx , rx ) = mpsc :: channel ();
スレッド:: spawn ( move || { tx.send ( 123 ) .unwrap ( ); }) ;
result = rx . recv ()とします。println! ( "{:?}" , result ); }
アプリケーション
プロセス間通信の基本的な用途に加えて、チャネルはストリームとして実現できるさまざまな並行プログラミング構造を実装するためのプリミティブとして使用できます。たとえば、チャネルを使用してfuture と promise を構築できます。future は 1 つの要素を持つチャネルであり、promise はチャネルに送信して future を実現するプロセスです。[4]同様に、イテレータはチャネルから直接構築できます。[5]
実装のリスト
- 非標準のライブラリベースのチャネル実装のリスト
- Scalaの場合:
- CSO(Scalaオブジェクトの通信)[6]は、チャネルベースの通信と並行性のための完全なDSLであり、その意味プリミティブはOCCAMプリミティブの一般化です。CSOは2007年から並行プログラミングの教育に使用されており、関連する講義はThreadCSO実装で見つけることができます。[7]
- C++ の場合:
- stlab [8]この実装は分割、およびさまざまなマージと圧縮操作をサポートしています。個々のノードに異なるエグゼキュータを接続できます。
参考文献
- ^ 「XMOS プログラミング ガイド | XMOS」。2016 年 3 月 4 日時点のオリジナルよりアーカイブ。2015年 5 月 10 日閲覧。
- ^ 「Effective Go - Goプログラミング言語」。
- ^ 「チャネル - Rust By Example」. doc.rust-lang.org . 2020年11月28日閲覧。
- ^ 「Futures Archived 2020-12-04 at the Wayback Machine」、Go Language Patterns Archived 2020-11-11 at the Wayback Machine
- ^ 「イテレータ Archived 2020-10-15 at the Wayback Machine」、Go 言語パターン Archived 2020-11-11 at the Wayback Machine
- ^ Sufrin, Bernard (2021-07-13)、ThreadCSO (PDF) 、2023-02-17取得
- ^ Sufrin, Bernard (2021-07-13)、ThreadCSO 、 2023-02-17取得
- ^ 「stlab は、Adobe のソフトウェア テクノロジー ラボの継続的な取り組みです。Adobe Source Libraries (ASL)、Platform Libraries、および新しい stlab ライブラリは、github でホストされています」。2021 年 1 月 31 日。
外部リンク
- Libthread チャネル実装
- ベル研究所と CSP スレッド
- リンボ – インフェルノ アプリケーション プログラミング
- Stackless.com – チャンネル
- – OCaml イベント
