rust学习十六.1、并发-乱弹和一个简单并发例子
1.rust学习一、入门之搭建简单开发环境2.rust学习二、入门之运行单个脚本3.rust学习四、控制语句4.rust学习五、认识所有权5.rust学习三、基本类型6.rust学习六、简单的struct结构7.rust学习七、枚举8.rust学习八、包和模块9.rust学习九.1、集合之向量10.rust学习九.2、集合之字符串11.rust学习九.3、集合之哈希映射表12.rust学习十、异常处理(错误处理)13.rust学习十一.1、泛型(通用类型)14.rust学习十一.2、利用Trait(特质)定义通用类型的共同行为15.rust学习十一.3、生命周期标记16.rust学习十二、测试17.rust学习十二、一个I/O程序练习18.rust学习十三.1、匿名函数(闭包)19.rust学习十三.2、迭代器20.rust学习十四.1、编译和发布单元包Crate21.rust学习十四.2、工作空间(workspace)22.rust学习十五.1、智能指针基本概念23.rust学习十五.2、智能指针之Box(盒子)指针24.rust学习十五.3、智能指针相关的Deref和Drop特质25.rust学习十五.4、Rc和RefCell指针26.rust学习十五.5、引用循环和内存泄露
27.rust学习十六.1、并发-乱弹和一个简单并发例子
28.rust学习十六.2、并发-利用消息传递进行线程间通讯29.rust学习十六.3、并发-线程之间共享数据30.rust学习十七.1、async和await如书本作者所言,并发编程在绝大部分语言中,都是相对复杂和困难的。
所以,涉及的内容会相对多一些,所涵盖的内容绝对不是几篇文章所可以容纳的。
权当一个乱弹琴!
和此系列的其它文章一样,本文的内容绝大部分来自于相关书籍,本人做了一些摘裁的工作,取我所需!
一、无畏并发
* 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> where F: 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() } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)