面试题答案
一键面试原子类型的基本作用
原子类型(如AtomicBool
)提供了一种线程安全的方式来操作数据。其作用在于确保对该类型数据的读写操作是原子性的,即这些操作不会被其他线程干扰,不会出现数据竞争问题,从而保证在多线程环境下数据的一致性和完整性。
实现简单停止标志
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
fn main() {
let stop_flag = AtomicBool::new(false);
let handle = thread::spawn(move || {
while!stop_flag.load(Ordering::Relaxed) {
// 线程执行的任务
println!("线程正在运行...");
thread::sleep(std::time::Duration::from_millis(100));
}
println!("线程停止");
});
// 主线程等待一段时间后设置停止标志
thread::sleep(std::time::Duration::from_secs(2));
stop_flag.store(true, Ordering::Relaxed);
handle.join().unwrap();
}
在上述代码中,AtomicBool
类型的stop_flag
被初始化为false
。线程在循环中通过load
方法获取stop_flag
的值,判断是否需要停止。主线程在等待2秒后,通过store
方法将stop_flag
设置为true
,从而停止子线程。
原子类型相较于普通类型在实现停止标志时的优势
- 线程安全:普通类型在多线程环境下读写操作不是原子性的,可能会出现数据竞争问题。而原子类型的读写操作是原子的,避免了数据竞争,确保了多线程环境下的正确性。
- 无需额外同步机制:使用普通类型实现停止标志,通常需要额外的锁(如
Mutex
)来保证数据一致性,这增加了代码复杂度和性能开销。原子类型本身就提供了线程安全的操作,无需额外的锁机制,提高了性能和代码简洁性。