Skip to content

30.2 同步管道

异步管道内部有一个不限长度的缓冲区,可以一直往里面填充数据,直至内存资源耗尽。异步管道的发送端调用 send 方法不会发生阻塞,只要把消息加入到缓冲区,它就马上返回。

同步管道的特点是:其内部有一个固定大小的缓冲区,用来缓存消息。如果缓冲区被填满了,继续调用 send 方法的时候会发生阻塞,等待接收端把缓冲区内的消息拿走才能继续发送。缓冲区的长度可以在建立管道的时候设置,而且 0 是有效数值。如果缓冲区的长度设置为 0,那就意味着每次的发送操作都会进入等待状态,直到这个消息被接收端取走才能返回。示例如下:


rust
use std::thread;
use std::sync::mpsc::sync_channel;

fn main() {
    let (tx, rx) = sync_channel(1);
    tx.send(1).unwrap();
    println!("send first");
    thread::spawn(move|| {
        tx.send(2).unwrap();
        println!("send second");
    });

    println!("receive first {}", rx.recv().unwrap());
    println!("receive second {}", rx.recv().unwrap());
}

我们可以看到,程序执行结果永远是:发送一个并接收一个之后,才会出现发送第二个接收第二个。

我们讲的这两种管道都是单向通信,一个发送一个接收,不能反过来。Rust 没有在标准库中实现管道双向通信。双向管道也不是不可能的,在第三方库中已经有了实现。

Released under the MIT License