面试题答案
一键面试优化思路
- 使用
Arc
:Arc
(原子引用计数)用于在多个线程间共享数据。它通过引用计数来管理数据的生命周期,确保当所有对数据的引用都消失时,数据被正确释放。这使得数据可以安全地在多线程环境中共享。 - 结合
Mutex
:Mutex
(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问数据。虽然Mutex
会带来锁竞争,但合理使用可以保证数据的一致性。为了减少锁竞争,可以尽量缩短持有锁的时间,只在真正需要修改数据时获取锁。 - 利用
Condvar
:Condvar
(条件变量)用于线程间的同步通信。当某个条件满足时,Condvar
可以通知等待的线程。这有助于减少不必要的锁竞争,例如,线程可以在等待某个条件时释放锁,而不是一直持有锁等待。
代码示例
use std::sync::{Arc, Mutex, Condvar};
use std::thread;
fn main() {
let data = Arc::new((Mutex::new(0), Condvar::new()));
let data_clone = data.clone();
let handle = thread::spawn(move || {
let (lock, cvar) = &*data_clone;
let mut num = lock.lock().unwrap();
*num = 42;
cvar.notify_one();
});
let (lock, cvar) = &*data;
let mut num = lock.lock().unwrap();
while *num == 0 {
num = cvar.wait(num).unwrap();
}
assert_eq!(*num, 42);
handle.join().unwrap();
}
在这个示例中:
Arc
用于在主线程和新线程间共享包含Mutex
和Condvar
的元组数据。Mutex
保护共享的整数变量num
。Condvar
用于在新线程修改num
后通知主线程,主线程在等待num
被修改时释放锁,避免了一直持有锁等待,从而减少锁竞争。