Rust修仙之道 第十三章 并行境 · 多线程、共享与消息灵道
第十三章:并行境 · 多线程、共享与消息灵道
“术者一身不可至万处,分灵影可并行化心。”
顾行云于静室冥修,心观符阵延迟,渐悟:“纵术法再快,若不能并行,终受瓶颈所限。”
他毅然踏入并行殿,学习 Rust 修真界最安全的“多线程术”。
一、灵影分身术 · thread::spawn()
最初的并发术式,乃是将灵气复制为影:
use std::thread;
fn main() {
let handle = thread::spawn(|| {
println!(" 分身执行灵术!");
});
println!(" 本体继续修炼");
handle.join().unwrap(); // 等待分身结束
}
分身
spawn()
生成后可独立运转,join()
阶段合体归一。
二、共享灵枢 · Arc<T>
(原灵复刻术)
若多个分身需访问同一份灵术卷轴,该如何控制所有权?
use std::sync::Arc;
let scroll = Arc::new(String::from("风刃卷轴"));
for _ in 0..3 {
let s = Arc::clone(&scroll);
thread::spawn(move || {
println!(" 分身施展:{}", s);
});
}
Arc<T>
即原灵复刻容器,共享所有权、只读稳定,但不可变更。
三、互斥之印 · Mutex<T>
(共享可变封印)
若多个分身还需修改灵力?此时需加封“互斥印”:
use std::sync::{Mutex, Arc};
let mana = Arc::new(Mutex::new(100));
for _ in 0..4 {
let m = Arc::clone(&mana);
thread::spawn(move || {
let mut mana_pool = m.lock().unwrap();
*mana_pool += 10;
});
}
Mutex::new(value)
创建封印灵池;.lock().unwrap()
打开封印、取得灵气所有权;Arc
包裹共享引用,避免灵权争夺。
顾行云自创口诀:“共享不争者为 Arc;共改需封者用 Mutex。”
四、通灵信道 · mpsc::channel()
(灵意传讯术)
除了共享,分身还可通过“信道”传递意念:
use std::sync::mpsc;
use std::thread;
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
tx.send(" 任务完成!").unwrap();
});
let received = rx.recv().unwrap();
println!("主术士收到:{}", received);
channel()
创建信道双口:发出端tx
,接收端rx
;可用于多源汇集、任务分发、事件驱动等多灵协作法。
灵术术式对比总结
技术术式 | 功效 | 用途 |
---|---|---|
thread::spawn() |
创建灵影任务 | 异步执行子任务 |
Arc<T> |
多分身共享灵气 | 多线程共享只读数据 |
Mutex<T> |
灵气封印池 | 多线程共享可变数据 |
channel() |
灵意传讯术 | 跨线程通讯 / 事件驱动 |
并发心诀 · 分身之理
术不再身施,而在并行调度;控共改之界,避冲突之灾,方为上乘“灵影之术”。
Rust修仙之道 第十三章 并行境 · 多线程、共享与消息灵道的更多相关文章
- 从零搭建Golang开发环境--go修仙序章
1. 什么是go语言 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态 .强类型.编译型语言 .Go 语 ...
- 走进shiro,构建安全的应用程序---shiro修仙序章
0. 写在前面 在最近的一个项目当中,我们基于Shiro实现我们系统的认证和授权.借此机会,写几篇博客,总结一下在本次实践当中遇到的问题,和较全面地学习一下Shiro的知识点, 1. 权限管理 权限管 ...
- PMBOK(第六版) PMP笔记——《十三》第十三章(项目干系人管理)
PMBOK(第六版) PMP笔记——<十三>第十三章(项目干系人管理) 第十三章 项目干系人管理: 了解干系人的需要和期望.解决实际发生的问题.管理利益冲突.促进干系人合理参与 项目决策和 ...
- PRML读书会第十三章 Sequential Data(Hidden Markov Models,HMM)
主讲人 张巍 (新浪微博: @张巍_ISCAS) 软件所-张巍<zh3f@qq.com> 19:01:27 我们开始吧,十三章是关于序列数据,现实中很多数据是有前后关系的,例如语音或者DN ...
- <构建之法>第十三章到十七章有感以及这个项目读后感
<构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- Gradle 1.12 翻译——第十三章 编写构建脚本
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- [汇编学习笔记][第十三章int指令]
第十三章int指令 13.1 int指令 格式: int n, n 为中断类型码 可以用int指令调用任何一个中断的中断处理程序(简称中断例程). 13.4 BIOS和DOS 所提供的中断例程 BIO ...
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
随机推荐
- public synchronized boolean add(E e)方法源码
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, C ...
- elemengui分页
<!-- 分页模块 --> <template> <div class="block" style="margin-top:20px&quo ...
- 大模型流式调用规范(SSE)
随着大语言模型的广泛应用,如何高效地与其进行接口调用成为一个关键问题.传统的请求-响应模式在面对大模型生成大量文本时存在响应延迟高.用户体验差等问题.流式输出(Streaming)是解决该问题的重要手 ...
- require、include、require_once和use的区别/命名空间的使用方法
1.require.include require.include都是文件包含,不同的是require语句会输出错误信息,并且立即终止脚本处理.而include语句在没有找到文件时则会输出警告,不会终 ...
- blk_mq多队列块设备浅析
1. 为什么要使用多队列 在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个队列: 在块设备层,来自多个cpu的bio请求被放在同 ...
- 【BUG】Linux目录下明明有可执行文件却提示找不到,“No such file or directory”,解决:为64位Ubuntu安装32位程序的运行架构
问题 我做了如下努力: ls显示:(能够成功显示) 修改文件名:(能够正常复制.修改.移动,并且被复制的仍然不能运行) 调整文件属性,弄成777: cat显示文件.(能够成功显示) root执行文件: ...
- 信息资源管理综合题之“SPD属于知识管理工具那一类 与 管理工具与知识库的区别 以及 使用知识地图是否可以用SynchroFLOW替代”
一.案例:1995年10月,微软开发了一项"技能规划与开发(SPD)"的计划,他们把每个系统开发人员的工作能力和这些特定工作需要的知识制作成地图,让那个员工与团队间的配合更加默契, ...
- python中list、tuple、set、dict区别
list.tuple.set.dict区别 参考:python的列表,字典,元组,集合的区别和各自使用方法 遍历set 由于set也是一个集合,所以,遍历set和遍历list类似,都可以通过for循环 ...
- Python标准库之Collections---Container datatype
Deques Deques,即 Double-ended-queues,是支持线程安全,内存高效的列表类对象.Deques是可改变的,支持索引等类似于list的操作,然而,我们不能直接对Deques进 ...
- np.random总结
import numpy as np (1)np.random.random_sample help(np.random.random_sample) Help on built-in functio ...