面试题答案
一键面试配合方式简述
- Mutex的作用:互斥锁用于保护共享数据,确保在同一时刻只有一个线程能够访问共享数据,防止数据竞争。
- Condvar的作用:条件变量用于线程间的通信。当某个条件满足时,一个线程可以通过条件变量通知其他等待该条件的线程。它不能单独使用,需要和互斥锁配合。
- 配合流程:
- 首先,线程获取Mutex的锁,访问共享数据。
- 然后,线程检查共享数据的状态是否满足某个条件。如果不满足,线程调用条件变量的
wait
方法。在调用wait
时,线程会自动释放Mutex的锁,进入等待状态。 - 当其他线程修改共享数据使得条件满足时,该线程可以通过条件变量的
notify_one
或notify_all
方法通知等待的线程。 - 被通知的线程醒来后,会重新获取Mutex的锁,再次检查条件是否满足(因为可能存在虚假唤醒),如果满足则继续执行后续操作。
示例代码
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;
cvar.notify_one();
});
let (lock, cvar) = &*pair;
let mut data = lock.lock().unwrap();
while!*data {
data = cvar.wait(data).unwrap();
}
handle.join().unwrap();
println!("Condition is met, data: {}", data);
}
在这个示例中,主线程获取锁并检查条件(*data
是否为true
),如果不满足则等待条件变量的通知。子线程修改共享数据(将*data
设为true
)并通知主线程。主线程被通知后重新获取锁并检查条件,满足条件后继续执行并打印结果。