面试题答案
一键面试-
原子类型的选择: 在Rust中,对于简单的布尔停止标志,
std::sync::atomic::AtomicBool
是一个合适的选择。它专门用于原子的布尔操作,并且提供了线程安全的访问方法。 -
通过原子操作实现线程安全的停止信号传递:
- 主线程可以通过设置
AtomicBool
的值为true
来发出停止信号。 - 子线程在运行过程中定期检查
AtomicBool
的值,当发现其为true
时,执行停止逻辑。
- 主线程可以通过设置
-
简单代码示例:
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
。