Rust代码示例
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和Mutex以及它们的作用
- Arc (Atomically Reference - Counted):
- 作用:Arc 用于在多个线程间共享数据。它通过引用计数的方式来管理数据的生命周期,当最后一个引用被销毁时,数据才会被释放。在多线程环境中,Arc 保证了引用计数操作的原子性,使得多个线程可以安全地共享数据。
- 在本示例中的必要性:如果不使用 Arc,就无法将数据结构安全地传递给多个线程,因为 Rust 的所有权系统默认情况下不允许在多个线程间共享可变数据。Arc 使得数据可以被多个线程持有相同的引用,从而实现数据共享。
- Mutex (Mutual Exclusion):
- 作用:Mutex 提供了一种机制,确保在任何时刻只有一个线程可以访问其内部的数据。它通过锁(lock)来实现互斥访问,当一个线程获取了锁,其他线程就必须等待锁被释放才能访问数据。
- 在本示例中的必要性:如果没有 Mutex,多个线程同时修改整数变量会导致数据竞争(data race),这是一种未定义行为。Mutex 保证了同一时间只有一个线程能够修改共享的整数变量,从而避免数据竞争问题。