Зав’язані канали
З обмеженими (синхронними) каналами 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.