面试题答案
一键面试可能出现的安全问题
- 数据竞争:当多个线程同时访问和修改共享数据时,会发生数据竞争。例如,一个线程读取数据的同时,另一个线程在修改它,可能导致未定义行为。
- 死锁:多个线程相互等待对方释放资源,形成一种僵持状态,导致程序无法继续执行。
使用Rust安全机制保证安全运行
- Mutex(互斥锁):用于保护共享数据,同一时间只有一个线程可以获取锁并访问数据,从而避免数据竞争。
- Arc(原子引用计数):用于在多个线程间共享数据,它提供了线程安全的引用计数功能。
代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
for _ in 0..1000 {
*num += 1;
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", *shared_data.lock().unwrap());
}
在上述代码中,Arc<Mutex<i32>>
用于在多个线程间安全地共享一个整数。每个线程通过 lock
方法获取锁,修改数据后释放锁。这样可以确保在并发环境下,loop
表达式对共享数据的操作是安全的。