并发的方式
- 多进程
- 多线程
- 协程
多线程遇到的问题
- 数据竞争
- 内存不安全和未定义的行为
常用的两种线程模型(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();
}