- 代码示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
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 (原子引用计数):
Arc
用于在多个线程间共享数据。它是线程安全的引用计数指针,允许多个线程拥有数据的只读引用。在这里,Arc
包裹了 Mutex
。
- Mutex (互斥锁):
Mutex
即互斥访问,它通过锁定机制来保证同一时间只有一个线程可以访问其包裹的数据。在 Rust 中,获取锁是通过 lock
方法,该方法返回一个 Result
,因为锁可能会被其他线程占用。unwrap
方法用于简单地处理这个 Result
,实际应用中可能需要更稳健的错误处理。
- 借用规则应用: 在 Rust 中,借用规则规定同一时间只能有一个可变借用(写操作)或多个不可变借用(读操作)。
Mutex
利用了这一规则,通过锁定机制来模拟可变借用。当一个线程调用 lock
方法并成功获取锁时,就相当于获得了一个可变借用,其他线程此时无法获取锁(无法获得可变借用),从而防止了数据竞争。当线程完成对数据的操作并释放锁时,其他线程才有机会获取锁并操作数据。