面试题答案
一键面试Mutex解决的并发问题类型
Mutex(互斥锁)主要用于解决多个线程同时访问共享数据时可能产生的数据竞争问题。数据竞争会导致程序出现未定义行为,比如数据不一致、程序崩溃等。Mutex通过只允许一个线程在同一时间内访问共享数据,确保共享数据在多线程环境下的一致性和安全性。
简单场景及使用示例
假设我们有一个共享的计数器,多个线程需要对其进行递增操作。以下是使用Mutex保护共享计数器的示例代码:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let result = counter.lock().unwrap();
println!("Final counter value: {}", *result);
}
在这个例子中,Arc<Mutex<i32>>
用于创建一个可在多个线程间共享的计数器,Mutex
确保每次只有一个线程能获取锁并修改计数器的值,从而避免数据竞争。lock
方法尝试获取锁,如果锁可用则返回一个 MutexGuard
,通过解引用 MutexGuard
可以访问和修改内部数据。操作完成后,MutexGuard
离开作用域,自动释放锁,允许其他线程获取锁并操作共享数据。