面试题答案
一键面试条件变量、互斥锁与等待线程的协作原理
- 互斥锁(Mutex):用于保护共享数据,确保在同一时间只有一个线程可以访问共享数据。在Rust中,
Mutex
类型提供了这种机制。 - 条件变量(Condvar):用于线程间的同步,当某个条件满足时唤醒等待的线程。
Condvar
类型实现了此功能。 - 等待线程:当条件不满足时,线程会通过条件变量进入等待状态。在等待过程中,线程会自动释放它持有的互斥锁,允许其他线程修改共享数据。当条件变量收到通知(通过
notify_one
或notify_all
方法),等待线程被唤醒后会重新获取互斥锁,然后检查条件是否满足。
示例代码
use std::sync::{Arc, Condvar, Mutex};
use std::thread;
fn main() {
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
let handle = thread::spawn(move || {
let (lock, cvar) = &*pair2;
let mut data = lock.lock().unwrap();
*data = true;
println!("线程修改数据并通知等待线程");
cvar.notify_one();
});
let (lock, cvar) = &*pair;
let mut data = lock.lock().unwrap();
while!*data {
data = cvar.wait(data).unwrap();
}
println!("等待线程被唤醒并获取到数据");
handle.join().unwrap();
}
在这个示例中,主线程等待某个条件(data
为true
),而新线程修改数据并通知主线程。主线程在等待时会释放互斥锁,确保其他线程可以修改共享数据。一旦收到通知,主线程重新获取互斥锁并检查条件是否满足。