面试题答案
一键面试Send trait
- 基本定义:
Send
是一个标记trait(marker trait),它表明实现了该trait的类型可以安全地跨线程发送(transfer ownership between threads)。如果一个类型T
实现了Send
,意味着T
的值可以在线程之间传递所有权。 - 并发编程作用:它确保了在多线程环境下,当一个值从一个线程移动到另一个线程时,不会出现未定义行为。Rust通过类型系统来保证这一点,使得线程间数据传递更加安全。
- 常见场景:几乎所有 Rust 的基本类型(如
i32
、String
、Vec<T>
等)都实现了Send
。例如,当你使用std::thread::spawn
创建一个新线程,并将某个值传递给新线程时,该值的类型必须实现Send
。
Sync trait
- 基本定义:
Sync
也是一个标记trait,它表明实现了该trait的类型可以安全地在多个线程间共享(shared reference between threads)。如果一个类型T
实现了Sync
,意味着可以在多个线程中同时拥有指向T
的不可变引用(&T
)。 - 并发编程作用:它保证了在多线程环境下,共享数据不会出现数据竞争等未定义行为。这是Rust实现线程安全的重要保障,通过类型系统在编译期进行检查。
- 常见场景:大部分Rust的基本类型也实现了
Sync
。例如,Arc<T>
类型只有在T: Sync
时,才可以安全地在多个线程间共享引用。像Mutex<T>
类型,只有当T: Sync
时,才可以在线程间共享,因为Mutex
是用来保护内部数据以实现线程安全访问的。