MST

星途 面试题库

面试题:Rust 线程间通信中通道(channel)的使用

请描述在 Rust 中如何使用通道(channel)实现线程间的基本通信。请举例说明如何创建发送端和接收端,并且在线程间传递简单的数据类型,比如整数。
47.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,使用std::sync::mpsc模块来创建通道实现线程间通信。mpsc代表多生产者,单消费者(multiple producer, single consumer)。以下是一个简单的示例,展示如何创建发送端和接收端,并在线程间传递整数:

  1. 引入必要的模块

    use std::sync::mpsc;
    use std::thread;
    
  2. 创建通道并获取发送端和接收端

    let (tx, rx) = mpsc::channel();
    

    这里tx是发送端(transmitter),rx是接收端(receiver)。

  3. 创建新线程并传递发送端

    let tx_clone = tx.clone();
    thread::spawn(move || {
        let num = 42;
        tx_clone.send(num).unwrap();
    });
    

    我们克隆了发送端tx,这样主线程和新线程都可以使用发送端。新线程将整数42发送到通道中。

  4. 在主线程中从接收端获取数据

    let received = rx.recv().unwrap();
    println!("Received: {}", received);
    

    rx.recv()方法会阻塞主线程,直到从通道接收到数据。如果通道关闭并且没有数据,recv会返回一个错误。这里我们使用unwrap来简单处理错误,如果成功接收到数据,就打印出来。

完整代码如下:

use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();
    let tx_clone = tx.clone();
    thread::spawn(move || {
        let num = 42;
        tx_clone.send(num).unwrap();
    });
    let received = rx.recv().unwrap();
    println!("Received: {}", received);
}

上述代码创建了一个通道,在新线程中发送一个整数,主线程从通道接收该整数并打印。