MST

星途 面试题库

面试题:Rust原子操作在停止标志设计中的基础应用

在Rust中,假设你要设计一个多线程程序,使用原子操作来实现一个停止标志。请描述原子类型的选择以及如何通过原子操作实现线程安全的停止信号传递,并给出简单代码示例。
41.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 原子类型的选择: 在Rust中,对于简单的布尔停止标志,std::sync::atomic::AtomicBool是一个合适的选择。它专门用于原子的布尔操作,并且提供了线程安全的访问方法。

  2. 通过原子操作实现线程安全的停止信号传递

    • 主线程可以通过设置AtomicBool的值为true来发出停止信号。
    • 子线程在运行过程中定期检查AtomicBool的值,当发现其为true时,执行停止逻辑。
  3. 简单代码示例

use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
use std::time::Duration;

fn main() {
    let stop_flag = AtomicBool::new(false);

    let handle = thread::spawn(move || {
        while!stop_flag.load(Ordering::Relaxed) {
            println!("子线程正在运行...");
            thread::sleep(Duration::from_secs(1));
        }
        println!("子线程接收到停止信号,即将停止。");
    });

    // 主线程等待3秒后发出停止信号
    thread::sleep(Duration::from_secs(3));
    stop_flag.store(true, Ordering::Relaxed);

    if let Err(e) = handle.join() {
        println!("线程出现错误: {:?}", e);
    }
}

在上述代码中:

  • AtomicBool类型的stop_flag用于表示停止标志。
  • 子线程通过stop_flag.load(Ordering::Relaxed)定期检查标志是否被设置。
  • 主线程通过stop_flag.store(true, Ordering::Relaxed)设置停止标志。
  • Ordering::Relaxed在这个简单场景下已足够,它提供了最低的内存顺序要求。在更复杂的场景中,可能需要更严格的内存顺序,如Ordering::SeqCst