有界チャネル

有界(同期)チャネルでは、send() が現在のスレッドをブロックすることがあります:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::sync::mpsc;
use std::thread;
use std::time::Duration;

fn main() {
    let (tx, rx) = mpsc::sync_channel(3);

    thread::spawn(move || {
        let thread_id = thread::current().id();
        for i in 0..10 {
            tx.send(format!("Message {i}")).unwrap();
            println!("{thread_id:?}: sent Message {i}");
        }
        println!("{thread_id:?}: done");
    });
    thread::sleep(Duration::from_millis(100));

    for msg in rx {
        println!("Main: got {msg}");
    }
}
  • send() を呼び出すと、新しいメッセージを入れる空きがチャネルに できるまで、現在のスレッドはブロックされます。チャネルから 読み取るものが誰もいない場合、スレッドは無期限にブロックされる可能性が あります。
  • 無界チャネルと同様に、チャネルが閉じられている場合、send() の 呼び出しはエラーを返して失敗します。
  • サイズが 0 の有界チャネルは「ランデブーチャネル」と呼ばれます。すべての 送信は、別のスレッドが recv() を呼び出すまで、現在のスレッドをブロックします。