Canais Delimitados

Com canais limitados e sĂ­ncronos, send pode bloquear a thread atual:

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!("Mensagem {i}")).unwrap();
            println!("{thread_id:?}: Mensagem {i} enviada");
        }
        println!("{thread_id:?}: terminado");
    });
    thread::sleep(Duration::from_millis(100));

    for msg in rx.iter() {
        println!("Main: obteve {msg}");
    }
}
  • Chamar send bloquearĂĄ a thread atual atĂ© que haja espaço no canal para a nova mensagem. A thread pode ser bloqueada indefinidamente se nĂŁo houver ninguĂ©m que leia do canal.
  • Uma chamada para send serĂĄ abortada com um erro (Ă© por isso que retorna Result) se o canal estiver fechado. Um canal Ă© fechado quando o receptor Ă© descartado.
  • Um canal limitado com um tamanho de zero Ă© chamado de “canal de encontro”. Cada envio bloquearĂĄ a thread atual atĂ© que outra thread chame read.