面试题答案
一键面试利用Rust特性保证静态对象并发数据安全
- 所有权与借用:Rust通过所有权系统确保同一时间只有一个所有者可以修改数据,且借用规则保证在借用期间数据不会被修改。但对于多线程并发访问静态对象,这些规则无法直接保证数据安全,因为不同线程可以同时访问静态对象。
- Mutex:互斥锁(Mutex)是Rust用于解决多线程数据竞争的重要工具。Mutex允许在任何时刻只有一个线程可以访问被其保护的数据。线程必须先获取锁才能访问数据,访问结束后释放锁,其他线程才能获取锁并访问数据。
代码示例
use std::sync::{Mutex, Arc};
use std::thread;
// 定义一个静态的Mutex包裹的对象
static SHARED_DATA: Mutex<i32> = Mutex::new(0);
fn main() {
let mut handles = vec![];
for _ in 0..10 {
let shared_data = Arc::clone(&SHARED_DATA);
let handle = thread::spawn(move || {
let mut data = shared_data.lock().unwrap();
*data += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let result = SHARED_DATA.lock().unwrap();
println!("Final value: {}", *result);
}
在上述代码中:
SHARED_DATA
是一个静态的Mutex<i32>
,使用Mutex
来保护i32
类型的数据。- 在
main
函数中,创建了10个线程,每个线程通过lock
方法获取Mutex
的锁,对共享数据进行修改。 - 最后,主线程等待所有子线程完成,并打印最终的共享数据值。这样就通过
Mutex
保证了静态对象在多线程并发访问时的数据安全。