MST

星途 面试题库

面试题:Rust中线程中断的基本实现方式

在Rust中,简述如何利用`std::sync::mpsc`通道来实现线程中断的一种基本方式。假设主线程要通知子线程中断,描述代码的大致结构和关键步骤。
41.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 引入必要的库
    use std::sync::mpsc;
    use std::thread;
    
  2. 创建通道: 在主线程中创建一个mpsc通道,用于主线程向子线程发送中断信号。
    let (sender, receiver) = mpsc::channel();
    
  3. 创建子线程: 使用thread::spawn创建子线程,并将receiver传递进去。
    let handle = thread::spawn(move || {
        loop {
            // 尝试接收中断信号
            match receiver.recv() {
                Ok(_) => {
                    // 接收到中断信号,退出循环
                    break;
                },
                Err(_) => {
                    // 这里可以处理接收错误的情况,比如通道关闭
                    break;
                }
            }
            // 子线程的正常工作逻辑
            println!("子线程正在工作...");
        }
    });
    
  4. 主线程发送中断信号: 在主线程的合适时机,比如满足某个条件时,向子线程发送中断信号。
    sender.send(()).unwrap();
    
  5. 等待子线程结束: 主线程调用handle.join()等待子线程执行完毕。
    handle.join().unwrap();
    

整个代码结构大概如下:

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

fn main() {
    let (sender, receiver) = mpsc::channel();
    let handle = thread::spawn(move || {
        loop {
            match receiver.recv() {
                Ok(_) => {
                    break;
                },
                Err(_) => {
                    break;
                }
            }
            println!("子线程正在工作...");
        }
    });
    // 主线程在合适时机发送中断信号
    sender.send(()).unwrap();
    handle.join().unwrap();
}