Rust常见面试题4
1、 where 子句 vs 内联约束
2、Send 与 Sync:区别和自动推导
核心答案:Send:表示一个类型可以安全地转移(move)所有权到另一个线程。Sync:表示一个类型可以安全地通过引用&T在多个线程之间共享。 自动推导:这两种trait都是 自动trait(autotrait),如果一个类型的所有成员都实现了Send/Sync,那么该类型会自动实现它们。 关键理解:T是Sync的充要条件是&T是Send的。 追问:“Rc<T>和Arc<T>分别实现了哪个?” 答案:Rc<T>不是Send也不是Sync;Arc<T>是Send和Sync(当T:Send+Sync时)。Rc使用非原子性的引用计数,如果在多线程间共享,会导致计数错误,因此被设计为不满足线程安全的trait。3、 Mutex 和 RwLock 的选择
4、 Mutex 中毒机制
核心答案:当一个线程持有某个Mutex锁时发生 panic,Rust会将这个Mutex标记为 “中毒(Poisoned)” 状态。这并非指数据损坏,而是表示它处于一种未知、不一致的状态。 处理方式:后续尝试获取该锁的线程,在获得锁后,会得到一个Result。你可以选择:unwrap():如果不想恢复,直接让程序崩溃(快速失败)。into_inner():恢复策略,强行“揭过”中毒状态,继续使用数据(如果你能确认数据仍是正确的)。 设计哲学:这是Rust宁可让程序崩溃,也不愿让不确定性状态传播的体现。这在金融和区块链系统中尤为重要。5、mpsc 通道的特点
核心答案:mpsc 代表Multi-Producer,Single-Consumer(多生产者,单消费者)。它是Rust标准库提供的基于队列的通信原语。 关键特点: 可以克隆出多个Sender,用于多个线程向一个Receiver发送数据。 提供同步(sync_channel,有界阻塞)和异步(channel,无界或有界非阻塞)两种模式。 适合构建工作队列或任务分配模式。