Boundedチャネル

Bounded(かつ同期的)なチャネルを用いたとき、sendは現在のスレッドをブロックすることがあります:

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 1..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.iter() {
        println!("Main: got {msg}");
    }
}
  • sendを呼んだときにチャネルに空きがなければ、現在のスレッドはブロックされます。もし誰もチャネルから値を読み取らない場合は、このスレッドは無期限にブロックされることがあります。
  • もしもチャネルが閉じられた場合、sendの呼び出しはエラーとともに中断します。(sendResultを返すのはこのためです。)受け取り側がドロップされたときに、チャネルは閉じられます。
  • サイズが0のBoundedチャネルは「ランデブーチャネル」と呼ばれます。別のスレッドがreadを呼ぶまでは、それぞれのsendは現在のスレッドをブロックします。