023 Rust死灵书之并发、竞争

介绍

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

Rust 死灵书相关的源码资料在github.com/anonymousGiga/Rustonomi...

并行和并发

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)]);
}

注释打开和不打开,结果不一样。

本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐一冲
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!