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中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
随机推荐
- SearXNG+MCP实现搜索引擎,想怎么搜就怎么搜
一.概述 MCP应用市场,有很多搜索引擎的应用.但是你们会发现,普遍都需要api-key.你必须花钱购买api-key才能实现搜索功能. 问题来了,我就想用免费搜索的,就向百度一样,可不可以? 答案是 ...
- Java 单元测试简单扫盲
前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...
- firebase studio硬刚cursor,送免费云服务可跑23b大模型
谷歌IDX提供免费高配云服务器(16核CPU,64G内存,300G硬盘),无需绑卡,只需一个能正常使用的谷歌账号.这是一个非常强大的开发环境,特别适合运行大型AI模型和开发工作. 一.Google I ...
- AD 侦查-MSRPC Over SMB
本文通过 Google 翻译 AD Recon – MSRPC Over SMB (135/139/445) 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 ...
- linux 指定运行级别
目录 基本介绍 指定运行级别 基本介绍 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用的运行级别是3和5,也可以 ...
- 【HUST】论于渊《Orange‘s:一个操作系统的实现》第三章中PagingDemoProc的必要性,是否可以直接调用LinearAddrDemo?
相关代码如下(第三章pmtest9a.asm改写): LinearAddrDemo equ 00401000h ProcHust equ 00401000h ProcIS19 equ 00501000 ...
- k8s之ingress反向代理pod
Ingress controller Nginx -->后来改造 Traefik -->也是用于微服务 Envoy -->微服务 Ingress资源 目前使用0.17.1版本ing ...
- Linux安装Libevent
环境 Ubuntu 20.04.2 64位 软件包安装 通过apt-get 命令可以直接安装Libevent,这种方式方便快捷,省时省力. 安装命令如下: sudo apt-get install l ...
- Ubuntu下好用的工具
UML画图工具 推荐:Drawio 参考:https://blog.csdn.net/jsm1010/article/details/112920539 安装命令:sudo snap install ...
- 第二次blog作业
1.前言 这是第二次接触 Java 编程语言大题.相比第一次的电梯调度问题,这次面对航空货运管理系统时我不再迷茫.反复读题后,我很快确定了代码编辑方向,并一步步完成代码编写.航空货运管理系统难度不大但 ...