- 如何使用:
Arc
用于在多个线程间共享资源的所有权,它提供原子引用计数,使得多个线程可以安全地持有对同一资源的引用。
Mutex
用于保护共享资源,确保同一时间只有一个线程可以访问该资源,实现线程间的互斥访问。
- 在多线程场景中,将需要共享的可变资源用
Mutex
包裹,然后再用Arc
来持有这个包裹后的资源,这样多个线程就可以通过Arc
来获取对Mutex
包裹资源的引用,并通过Mutex
的锁机制来安全地访问和修改资源。
- 代码示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个用Mutex包裹的i32类型资源,并使用Arc来持有
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆Arc,以便每个线程都有自己的引用
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
// 尝试获取Mutex的锁
let mut num = data.lock().unwrap();
// 安全地修改共享资源
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Final value: {}", *shared_data.lock().unwrap());
}
- 为什么这种组合能保证资源的安全访问:
Arc
负责在多个线程间安全地共享资源的所有权,它的原子引用计数机制确保在所有线程都不再使用资源时,资源能被正确释放。
Mutex
提供了互斥访问控制,通过锁机制,同一时间只有一个线程可以获取锁并访问内部包裹的资源。其他线程在尝试获取锁时会被阻塞,直到锁被释放。这样就避免了多个线程同时访问和修改资源导致的数据竞争问题,从而保证了资源的安全访问。