面试题答案
一键面试在Rust中,可以使用Arc
(原子引用计数)来实现数据的共享,结合Mutex
(互斥锁)来保证线程安全,std::sync::atomic::AtomicUsize
来实现宽松顺序的原子操作。以下是示例代码:
use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(AtomicUsize::new(0)));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut lock = data.lock().unwrap();
lock.fetch_add(1, Ordering::Relaxed);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let result = Arc::try_unwrap(shared_data)
.ok()
.unwrap()
.into_inner()
.load(Ordering::Relaxed);
println!("Final result: {}", result);
}
在这个示例中:
Arc<Mutex<AtomicUsize>>
用于在多个线程间共享一个原子整数,并保证线程安全。Arc
允许数据在多个线程间共享所有权。Mutex
确保同一时间只有一个线程可以访问共享数据。AtomicUsize
提供了原子操作,fetch_add
方法使用Ordering::Relaxed
顺序,满足宽松顺序访问的要求。- 最后通过
try_unwrap
和load
方法获取最终的结果。