内存共享
共享内存类似多所有权: 多个线程可以访问同一数据
Rust 使用智能指针 支持了多所有权, 但是会增加系统的额外复杂性. 因为需要正确的管理不同的所有者, Rust的类型系统和所有权模型可以帮助程序员正确的管理这些所有者.
互斥锁(mutex, mutual exclusion) 一次只允许一个线程访问数据 , 线程首先需要获得互斥锁, 来表明希望访问数据, 锁会记录数据的排他性访问权限.
互斥锁需要注意
- 在使用数据前获得锁
- 在使用完需要解锁, 以使得其他线程能够获取访问权限
Rust的类型系统和所有权模型可以保障上锁和解锁不会出现错误.
Mutex<T> 是一个智能指针, 它实现了Deref来指向内部数据, 也实现了Drop在离开作用域时自动解锁数据
另外, 为了让数据在线程间安全的发送, 需要使用 Arc (atomic reference counted), 它是安全的用于并发环境的 Rc .
Rust展开
12345678910111213141516171819202122232425
use std::thread;
use std::sync::{Mutex, Arc};
fn main(){
let x = Arc::new (Mutex::new(0) );
let mut thes = vec![];
for _ in 0..6 {
let x = Arc::clone(&x);
let th = thread::spawn(move ||{
let mut y = x.lock().unwrap();
*y = *y + 1;
});
thes.push(th);
}
for th in thes {
th.join().unwrap();
}
println!("Result: {}", x.lock().unwrap());
}
/*************output**********************/
Result: 6
Rust 并不能规避掉使用的 Mutex<T> 的错误. 正如 Rc<T> 也会造成循环引用的风险, Mutex<T> 也可能出现死锁(deadlock)的情况. 比如一个操作需要锁住两个资源, 而这两个资源在不同的线程各持有一个锁的时候, 这会造成他们永远互相等待.