面试题答案
一键面试AtomicUsize
常用方法
load
方法:从原子变量中读取值。use std::sync::atomic::{AtomicUsize, Ordering}; let atomic_num = AtomicUsize::new(5); let value = atomic_num.load(Ordering::SeqCst); println!("Loaded value: {}", value);
store
方法:将值存储到原子变量中。use std::sync::atomic::{AtomicUsize, Ordering}; let atomic_num = AtomicUsize::new(0); atomic_num.store(10, Ordering::SeqCst);
fetch_add
方法:原子地增加给定的值,并返回旧值。use std::sync::atomic::{AtomicUsize, Ordering}; let atomic_num = AtomicUsize::new(5); let old_value = atomic_num.fetch_add(3, Ordering::SeqCst); println!("Old value: {}, new value: {}", old_value, atomic_num.load(Ordering::SeqCst));
fetch_sub
方法:原子地减少给定的值,并返回旧值。use std::sync::atomic::{AtomicUsize, Ordering}; let atomic_num = AtomicUsize::new(8); let old_value = atomic_num.fetch_sub(2, Ordering::SeqCst); println!("Old value: {}, new value: {}", old_value, atomic_num.load(Ordering::SeqCst));
使用AtomicUsize
实现多线程计数器
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
fn main() {
let counter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
for _ in 0..1000 {
counter.fetch_add(1, Ordering::SeqCst);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final counter value: {}", counter.load(Ordering::SeqCst));
}
在上述代码中,Arc
用于在多个线程间共享AtomicUsize
实例。每个线程通过fetch_add
方法对计数器进行原子增加操作,确保在多线程环境下计数的正确性。