Зав'язані канали

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