如书本作者所言,并发编程在绝大部分语言中,都是相对复杂和困难的。
所以,涉及的内容会相对多一些,所涵盖的内容绝对不是几篇文章所可以容纳的。
权当一个乱弹琴!
和此系列的其它文章一样,本文的内容绝大部分来自于相关书籍,本人做了一些摘裁的工作,取我所需!
一、无畏并发
* 1.并发(concurrent)和并行(parallel)的区别. 前者是不同程序相互独立运行,强调独立;并行则是不同程序同时运行,强调同时.
* 但事实上,并发也有同时的概念
* 2.所有权和类型系统是一系列解决内存安全 和 并发问题的强有力的工具!通过利用所有权和类型检查,在 Rust 中很多并发错误都是 编译时 错误,而非运行时错误
* 3.可以在开发时修复代码,而不是在部署到生产环境后修复代码 -- 这就是无畏并发(fearless concurrency)的由来。 这是
* rust的所有权和类型系统检查所带来的好处
* 4.rust认为所有权系统和类型检查那么重要,而这是导致它的代码特别难于阅读和理解的缘故
二、rust的并发工具
期望提供在任何给定的情况下有着最高的性能且对硬件有更少的抽象
* 1.消息传递(Message passing)并发,其中信道(channel)被用来在线程间传递消息。
* 2.共享状态(Shared state)并发,其中多个线程可以访问同一片数据。
* 3.Sync 和 Send trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。
三、简单的示例
以下例子是改自书本:
use std::thread;use std::time::Duration;fn main() {let v = vec![1, 2, 3,4,5,6,7,8,9,10];let handle = thread::spawn(move ||->Vec<i32> { //如果这里不添加move关键字,编译会报错println!("Here's a vector: {:?}",v);//循环v,每次等待50毫秒for i in v.iter() {println!("T-1-waiting...:{} ***(^^)",i);thread::sleep(Duration::from_millis(50));}v});//循环10次,每次等待20毫秒for x in 0..10 {println!("T-0-waiting...:{}",x);thread::sleep(Duration::from_millis(20));}let p=handle.join().unwrap();println!("It's back!{:?}",p); }
这个例子的几个重点:
- 匿名函数(闭包) 和MOVE
-
thread::spawn 创建一个子线程,并返回一个JoinHandle<T>
- JoinHandle.join() 返回一个 Result
#[stable(feature = "rust1", since = "1.0.0")] pub fn spawn<F, T>(f: F) -> JoinHandle<T> whereF: FnOnce() -> T,F: Send + 'static,T: Send + 'static, {Builder::new().spawn(f).expect("failed to spawn thread") }
impl<'scope, T> JoinInner<'scope, T> {fn join(mut self) -> Result<T> {self.native.join();Arc::get_mut(&mut self.packet).unwrap().result.get_mut().take().unwrap()} }