rust的并发编程

2022-05-14 22:48:25 浏览数 (2)

并发的方式

  • 多进程
  • 多线程
  • 协程

多线程遇到的问题

  • 数据竞争
  • 内存不安全和未定义的行为

常用的两种线程模型(rust都支持)

  • 锁管理临界区
  • 消息通信

rust的并发

  • 通过后thread::spawn关键字
  • 自定义线程通过Builder::new

线程从并发模型

  • 数据共享 Rrc实现变量-可以读,但是没法修改
  • 互斥mutex。
  • arc和mutex。共享变量
  • 支持读写锁RwLock
  • 通过消息通信
    • mpse模块 channel和sync_channel

rust中的线程安全

  • parking_lot检查死锁
  • 保证安全的特征,send和sync

在mutex和rwlock无法满足性能,或者觉得不好用时

actor模型比如库actix,rayon工作窃取,crossbeam并发工具库

代码语言:rust复制
use std::thread;
//use std::rc::Rc;
use std::sync::Arc;
use std::sync::Mutex;
use std::sync::mpsc::channel;

fn main() {
    /*
    //error
    let lists = Rc::new(vec![0, 1, 2, 3, 4]);
    let mut childs = vec![];
    for n in 0..5 {
        let ns = lists.clone();
        let c = thread::spawn(||{
            println!("{}", lists[n]);
        });
        childs.push(c);
    }

    for c in childs {
        c.join().unwrap();
    }
    */

    /*
    //error 需要锁
    let mut childs = vec![];
    let mut lists = Arc::new(vec![]);
    for n in 0..5 {
        let mut ns = lists.clone();
        let c = thread::spawn(move || {
            lists.push(n);
        });
        childs.push(c);
    }
    for c in childs {
        c.join().unwrap();
    }
    */
    
    let mut childs = vec![];
    let lists = Arc::new(Mutex::new(vec![]));
    for n in 0..5 {
        let mut ns = lists.clone();
        let c = thread::spawn(move || {
            let mut v = ns.lock().unwrap();
            v.push(n);
        });
        childs.push(c);
    }
    for c in childs {
        c.join().unwrap();
    }
    println!("{:?}", lists);

    let (sender,receiver) = channel();

    let thread2 = thread::spawn(move||{
        while let Ok(n) = receiver.recv() {
            println!("received {}", n);
        }
    });
    for i in 0..20{
        sender.send(i).unwrap();
    }
    drop(sender);
    thread2.join().unwrap();


}

0 人点赞