Зав'язані канали
З обмеженими (синхронними) каналами 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 0..10 { tx.send(format!("Повідомлення {i}")).unwrap(); println!("{thread_id:?}: надіслано Повідомлення {i}"); } println!("{thread_id:?}: виконано"); }); thread::sleep(Duration::from_millis(100)); for msg in rx.iter() { println!("Головний: отримав {msg}"); } }
This slide should take about 8 minutes.
- Виклик
send()
заблокує поточний потік, доки в каналі не залишиться місця для нового повідомлення. Потік може бути заблокований на невизначений термін, якщо ніхто не читає з каналу. - Виклик
send()
буде перервано з помилкою (ось чому він повертаєResult
), якщо канал закрито. Канал закривається, коли отримувача видалено. - Обмежений канал з нульовим розміром називається "каналом зустрічі". Кожне надсилання блокуватиме поточний потік, доки інший потік не викличе
recv
.