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}");
}
}
This slide should take about 8 minutes.
- Chamar
sendbloqueará 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
sendserá abortada com um erro (é por isso que retornaResult) 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
recv.