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
の呼び出しはエラーとともに中断します。(send
がResult
を返すのはこのためです。)受け取り側がドロップされたときに、チャネルは閉じられます。 - サイズが0のBoundedチャネルは「ランデブーチャネル」と呼ばれます。別のスレッドが
read
を呼ぶまでは、それぞれのsendは現在のスレッドをブロックします。