天天看点

023 Rust死灵书之并发、竞争

介绍

本系列录制的视频主要放在B站上​​Rust死灵书学习视频​​

Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source

并行和并发

Rust标准库中,提供的是操作系统级别的线程和阻塞系统调用的支持。

竞争

数据竞争是指:

两个或者两个以上的线程并发的访问同一块内存,两个线程之间是非同步的,并且其中一个线程会做写操作。      

数据竞争会导致未定义行为,按照Rust的安全哲学,不允许未定义行为,因此Rust中不允许有数据竞争。

实现的方式:

1、通常情况下,Rust所有权系统就避免了数据竞争(可变引用不存在别名);
2、内部可变性问题,通过Send和Sync trait来保证。      

竞争条件

竞争条件指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形。

Rust并不会避免一般竞争条件

use std::thread;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::time;

fn main() {
  let data = vec![1, 2, 3, 4];
  let idx = Arc::new(AtomicUsize::new(0));
  let other_idx = idx.clone();

  thread::spawn(move || {
      other_idx.fetch_add(10, Ordering::SeqCst);
  });
  
  //let ten_millis = time::Duration::from_millis(10);
  //thread::sleep(ten_millis);

  println!("{}", data[idx.load(Ordering::SeqCst)]);
}