面试题答案
一键面试- 使用原子操作保证数据一致性和线程安全的简述:
- 在Rust中,
std::sync::atomic
模块提供了原子类型和操作,用于在多线程环境下对共享变量进行无锁的原子操作。 - 对于简单的整数类型的递增操作,可以使用
AtomicUsize
(无符号整数)或AtomicI32
(有符号32位整数)等原子类型。这些类型提供了fetch_add
等方法,该方法会原子性地将指定的值加到当前值上,并返回旧值。通过使用这些原子类型和方法,不同线程对共享变量的递增操作不会相互干扰,从而保证数据的一致性和线程安全。
- 在Rust中,
- 代码示例:
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
fn main() {
let shared_variable = AtomicUsize::new(0);
let mut handles = vec![];
for _ in 0..10 {
let shared_variable_clone = shared_variable.clone();
let handle = thread::spawn(move || {
for _ in 0..1000 {
shared_variable_clone.fetch_add(1, Ordering::SeqCst);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", shared_variable.load(Ordering::SeqCst));
}
在上述代码中:
- 首先创建了一个
AtomicUsize
类型的共享变量shared_variable
,初始值为0。 - 然后启动10个线程,每个线程对
shared_variable
进行1000次原子递增操作。 - 最后等待所有线程执行完毕,并打印出共享变量的最终值。这里使用
Ordering::SeqCst
表示顺序一致性内存序,这是一种比较严格的内存序,能保证所有线程看到的操作顺序一致。