项目中碰到了阻塞的问题, 所以来看看怎么使用rust并行.
仅作为个人学习笔记.
参考资料:https://my_lv.gitbooks.io/rust/content/concurrency-parallel-thread/thread.html其实是照搬
rust并发/并行/多线程
可以用标准库或tokio.标准库见下文.
创建线程
FnMut和FnOnce
FnOnce是会转移所有权的闭包函数,且函数运行后所有权会被释放不会归还.
所以叫FnOnce: 只能运行一次.
FnMut: 使用可变借用的闭包函数,运行后会归还所有权.
1 | let new_thread = thread::spawn(move|| { |
设置线程名称和堆栈的创建方式:
1 | let new_thread = thread::Builder::new() |
消息传递
和go语言一样 使用channel.
mpsc是多生产者,单消费者.
1 | let (tx, rx): (mpsc::Sender<i32>, mpsc::Receiver<i32>) = |
使用Arc<>包装并传递自定义类型:
1 | pub struct Student { |
try_recv(): 不阻塞,立即返回Result< T,E >.Err表示没有消息.
recv(): 阻塞直到有消息并返回.
使用Arc<Mutex<>>
来共享和修改数据.
如何产生多个发送者:let tx1 = tx.clone()