面试题答案
一键面试trait 协助实现并发安全保障的原理
在Rust中,trait通过明确类型需要实现的方法集合,为并发安全提供保障。例如,Sync
和Send
这两个特殊的marker trait。它们在编译器层面进行类型检查,确保在并发场景下,类型的使用符合安全规则,防止数据竞争等并发问题。
Send
trait
- 作用原理:
Send
trait标记一个类型可以安全地跨线程发送。如果一个类型实现了Send
,意味着该类型的值可以在线程之间传递所有权。Rust编译器通过类型系统,确保只有实现了Send
的类型才能在不同线程间传递。例如,基本类型(如i32
、String
等)都实现了Send
。 - 示例代码:
use std::thread;
fn main() {
let data = String::from("Hello, world!");
let handle = thread::spawn(move || {
println!("Received: {}", data);
});
handle.join().unwrap();
}
在上述代码中,String
类型实现了Send
,因此可以安全地传递到新线程中。
Sync
trait
- 作用原理:
Sync
trait标记一个类型可以安全地在多个线程间共享。如果一个类型实现了Sync
,意味着指向该类型的引用(&T
)可以安全地在多个线程间共享。例如,i32
实现了Sync
,所以&i32
可以在多个线程间安全共享。 - 示例代码:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data_clone.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", *data.lock().unwrap());
}
在这段代码中,Arc<Mutex<i32>>
实现了Sync
,使得多个线程可以安全地共享对Mutex
保护的i32
数据的引用。Arc
用于线程间共享所有权,Mutex
用于保证同一时间只有一个线程可以访问数据。