面试题答案
一键面试-
选择原子类型:
- 在Rust中,可以使用
std::sync::atomic::AtomicU32
来表示任务进度。AtomicU32
是一个用于32位无符号整数的原子类型,适合表示进度百分比等数值。
- 在Rust中,可以使用
-
实现步骤:
- 引入必要的库:
use std::sync::{Arc, atomic::{AtomicU32, Ordering}}; use std::thread;
- 创建原子变量:
let progress = Arc::new(AtomicU32::new(0));
- 创建工作线程:
let progress_clone = Arc::clone(&progress); let handle = thread::spawn(move || { for i in 0..100 { progress_clone.store(i, Ordering::SeqCst); thread::sleep(std::time::Duration::from_millis(100)); } });
- 主线程定期读取进度并打印:
loop { let current_progress = progress.load(Ordering::SeqCst); println!("Current progress: {}%", current_progress); if current_progress == 100 { break; } thread::sleep(std::time::Duration::from_secs(1)); }
- 等待工作线程结束:
handle.join().unwrap();
- 引入必要的库:
整个示例代码如下:
use std::sync::{Arc, atomic::{AtomicU32, Ordering}};
use std::thread;
fn main() {
let progress = Arc::new(AtomicU32::new(0));
let progress_clone = Arc::clone(&progress);
let handle = thread::spawn(move || {
for i in 0..100 {
progress_clone.store(i, Ordering::SeqCst);
thread::sleep(std::time::Duration::from_millis(100));
}
});
loop {
let current_progress = progress.load(Ordering::SeqCst);
println!("Current progress: {}%", current_progress);
if current_progress == 100 {
break;
}
thread::sleep(std::time::Duration::from_secs(1));
}
handle.join().unwrap();
}
在上述代码中:
AtomicU32
的store
方法用于更新进度值,load
方法用于读取进度值。Ordering::SeqCst
是一种较强的内存序,确保对原子变量的读写操作以一种全局一致的顺序发生,保证数据一致性。