内存共享

共享内存类似多所有权: 多个线程可以访问同一数据

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)的情况. 比如一个操作需要锁住两个资源, 而这两个资源在不同的线程各持有一个锁的时候, 这会造成他们永远互相等待.

- roadup -