rust学习十六.1、并发-乱弹和一个简单并发例子
如书籍作者所言,并发编程在绝大部分语言中,都是相对复杂和困难的。所以,涉及的内容会相对多一些,所涵盖的内容绝对不是几篇文章所可以容纳的。
权当一个乱弹琴!
和此系列的别的文章一样,本文的内容绝大部分来自于相关书籍,本人做了一些摘裁的工作,取我所需!
一、无畏并发
* 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!;
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);
}
https://img2024.cnblogs.com/blog/1177268/202501/1177268-20250108185122828-1876147028.png
这个例子的几个重点:
[*] 匿名函数(闭包) 和MOVE
[*]thread::spawn 创建一个子线程,并返回一个JoinHandle<T>
[*] JoinHandle.join() 返回一个 Result
#
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()
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]