面试题答案
一键面试Sync trait常见使用场景
- 多线程共享数据:当需要在多个线程间安全地共享数据时,实现
Sync
trait可以确保数据在线程间传递是安全的。例如,在构建多线程服务器时,可能需要多个线程共享一些配置信息或全局状态,这些数据类型就需要实现Sync
。 - 线程池:在线程池中的任务可能需要访问共享资源,这些共享资源如果要在线程间安全传递,其类型需要实现
Sync
。
示例代码
use std::sync::{Arc, Mutex};
use std::thread;
// 定义一个结构体并实现Sync trait
struct SharedData {
value: i32,
}
unsafe impl Sync for SharedData {}
fn main() {
let shared_data = Arc::new(Mutex::new(SharedData { value: 0 }));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut data = data.lock().unwrap();
data.value += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let final_value = shared_data.lock().unwrap().value;
println!("Final value: {}", final_value);
}
在上述代码中:
- 定义了一个简单的
SharedData
结构体,通过unsafe impl Sync for SharedData {}
手动实现了Sync
trait,使得该结构体可以在线程间安全共享。 - 使用
Arc
(原子引用计数)和Mutex
(互斥锁)来包装SharedData
,以确保线程安全。 - 创建10个线程,每个线程获取
SharedData
的锁,对其value
字段进行递增操作。最后主线程等待所有线程完成,并打印最终的value
值。