面试题答案
一键面试Arc
和Mutex
的作用:Arc
(原子引用计数,Atomic Reference Counting):用于在多个线程间共享数据。它允许数据有多个所有者,并且其引用计数操作是线程安全的。这意味着多个线程可以同时持有对同一数据的Arc
指针,而不会产生数据竞争。Mutex
(互斥锁,Mutual Exclusion):用于保护数据,确保同一时间只有一个线程可以访问数据。当一个线程获取了Mutex
的锁,其他线程必须等待该锁被释放后才能获取锁并访问数据。
- 代码示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个Arc<Mutex<i32>>类型的共享数据
let data = Arc::new(Mutex::new(0));
// 克隆Arc,以便每个线程都有自己的引用
let data1 = data.clone();
let data2 = data.clone();
// 启动第一个线程
let handle1 = thread::spawn(move || {
let mut num = data1.lock().unwrap();
*num += 1;
});
// 启动第二个线程
let handle2 = thread::spawn(move || {
let mut num = data2.lock().unwrap();
*num += 2;
});
// 等待两个线程完成
handle1.join().unwrap();
handle2.join().unwrap();
// 打印最终结果
println!("Final value: {}", data.lock().unwrap());
}
在这个示例中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的变量data
,其中Mutex
保护着一个i32
类型的数据,初始值为0。 - 然后克隆了
Arc
,分别为data1
和data2
,以便每个线程都可以持有对共享数据的引用。 - 每个线程通过
lock()
方法获取Mutex
的锁,这一步可能会阻塞,直到锁可用。获取锁后,返回一个智能指针,通过解引用可以修改内部的数据。 - 最后等待两个线程完成,并打印出共享数据的最终值。由于
Mutex
的保护,两个线程不会同时修改数据,从而保证了线程安全。