介绍
- 通道类似于单所有权,当值被传递到通道后,该值后续无法再被使用。
- 互斥器(Mutex)用于在线程之间共享数据时确保互斥访问,避免数据竞态条件。共享数据类似于多所有权,即多个线程可以同时访问相同的内存地址。
- 互斥器使用时需要先获取到锁,使用后需要释放锁,离开作用域时自动释放
示例
启动10个线程,对同一个变量进行加1操作
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个 Arc 包裹的 Mutex,便于在线程间共享
// Arc: Atomic Reference Counting,即原子引用计数
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();
}
// 获取最终结果
println!("结果: {}", *counter.lock().unwrap()); // 输出10
}