当前位置: 首页 > article >正文

Rust并发安全模式:从线程安全到无锁编程

Rust并发安全模式从线程安全到无锁编程引言并发编程是后端开发的核心挑战之一。Rust通过所有权系统和类型安全在编译时保证并发安全避免了数据竞争等常见问题。本文将深入探讨Rust中的并发安全模式包括线程同步、无锁编程、原子操作等核心技术。一、线程安全基础1.1 Send和Sync traituse std::thread; fn send_example() { let data vec![1, 2, 3]; // VecT实现了Send可以在线程间传递 thread::spawn(move || { println!(Data: {:?}, data); }).join().unwrap(); } fn sync_example() { let data vec![1, 2, 3]; let data_ref data; // VecT实现了Sync可以在线程间共享引用 thread::spawn(move || { println!(Data ref: {:?}, data_ref); }).join().unwrap(); }1.2 线程安全的数据结构use std::collections::HashMap; use std::sync::{Arc, Mutex}; use std::thread; fn thread_safe_hashmap() { let shared_map: ArcMutexHashMapString, i32 Arc::new(Mutex::new(HashMap::new())); let mut handles vec![]; for i in 0..10 { let map Arc::clone(shared_map); let handle thread::spawn(move || { let mut data map.lock().unwrap(); data.insert(format!(key{}, i), i); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(Map size: {}, shared_map.lock().unwrap().len()); }二、线程同步原语2.1 Mutex和RwLockuse std::sync::{Mutex, RwLock}; use std::thread; fn mutex_example() { let counter Mutex::new(0); let mut handles vec![]; for _ in 0..10 { let handle thread::spawn(move || { let mut num counter.lock().unwrap(); *num 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(Result: {}, *counter.lock().unwrap()); } fn rwlock_example() { let data RwLock::new(vec![1, 2, 3]); // 多个读锁可以同时持有 let read_handle1 thread::spawn(|| { let data data.read().unwrap(); println!(Read 1: {:?}, data); }); let read_handle2 thread::spawn(|| { let data data.read().unwrap(); println!(Read 2: {:?}, data); }); read_handle1.join().unwrap(); read_handle2.join().unwrap(); // 写锁独占 let write_handle thread::spawn(|| { let mut data data.write().unwrap(); data.push(4); println!(After write: {:?}, data); }); write_handle.join().unwrap(); }2.2 Condvar条件变量use std::sync::{Arc, Condvar, Mutex}; use std::thread; fn condvar_example() { let pair Arc::new((Mutex::new(false), Condvar::new())); let pair2 Arc::clone(pair); thread::spawn(move || { let (lock, cvar) *pair2; let mut started lock.lock().unwrap(); *started true; cvar.notify_one(); println!(Worker thread started); }); let (lock, cvar) *pair; let mut started lock.lock().unwrap(); while !*started { started cvar.wait(started).unwrap(); } println!(Main thread detected start); }三、无锁编程3.1 原子操作use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; fn atomic_counter() { static COUNTER: AtomicUsize AtomicUsize::new(0); let mut handles vec![]; for _ in 0..1000 { let handle thread::spawn(|| { COUNTER.fetch_add(1, Ordering::SeqCst); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!(Counter: {}, COUNTER.load(Ordering::SeqCst)); } fn compare_and_swap() { static VALUE: AtomicUsize AtomicUsize::new(0); let handle1 thread::spawn(|| { VALUE.compare_and_swap(0, 1, Ordering::SeqCst); }); let handle2 thread::spawn(|| { VALUE.compare_and_swap(0, 2, Ordering::SeqCst); }); handle1.join().unwrap(); handle2.join().unwrap(); println!(Value: {}, VALUE.load(Ordering::SeqCst)); }3.2 内存顺序use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::thread; fn memory_ordering() { let ready AtomicBool::new(false); let data AtomicUsize::new(0); let producer thread::spawn(move || { data.store(42, Ordering::Release); ready.store(true, Ordering::Release); }); let consumer thread::spawn(move || { while !ready.load(Ordering::Acquire) {} println!(Data: {}, data.load(Ordering::Acquire)); }); producer.join().unwrap(); consumer.join().unwrap(); }四、并发安全模式4.1 生产者-消费者模式use std::sync::mpsc; use std::thread; fn producer_consumer() { let (tx, rx) mpsc::channel(); // 生产者 let producer thread::spawn(move || { for i in 0..10 { tx.send(i).unwrap(); println!(Produced: {}, i); } }); // 消费者 let consumer thread::spawn(move || { for received in rx { println!(Consumed: {}, received); } }); producer.join().unwrap(); consumer.join().unwrap(); } fn multiple_producers() { let (tx, rx) mpsc::channel(); for i in 0..3 { let tx tx.clone(); thread::spawn(move || { tx.send(i).unwrap(); println!(Producer {} sent: {}, i, i); }); } drop(tx); for received in rx { println!(Consumed: {}, received); } }4.2 工作窃取模式use crossbeam::deque::{Steal, Worker}; use std::thread; fn work_stealing() { let mut workers Vec::new(); let mut handles Vec::new(); for i in 0..4 { let worker Worker::new_fifo(); workers.push(worker); } for (i, worker) in workers.iter_mut().enumerate() { for j in 0..10 { worker.push((i, j)); } } for i in 0..4 { let workers workers.clone(); let handle thread::spawn(move || { let mut local Worker::new_fifo(); loop { let mut stolen false; for (j, worker) in workers.iter().enumerate() { if j ! i { match worker.steal() { Steal::Success(task) { println!(Thread {} stole task {:?}, i, task); stolen true; } Steal::Empty continue, Steal::Retry continue, } } } if !stolen { if let Some(task) local.pop() { println!(Thread {} processed local task {:?}, i, task); } else { break; } } } }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } }五、并发数据结构5.1 并发安全队列use std::sync::Arc; use crossbeam_queue::ConcurrentQueue; fn concurrent_queue() { let queue Arc::new(ConcurrentQueue::unbounded()); let mut handles Vec::new(); for i in 0..5 { let queue Arc::clone(queue); let handle thread::spawn(move || { queue.push(i).unwrap(); println!(Pushed: {}, i); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } while let Ok(value) queue.pop() { println!(Popped: {}, value); } }5.2 无锁哈希表use dashmap::DashMap; use std::thread; fn dashmap_example() { let map DashMap::new(); let mut handles Vec::new(); for i in 0..10 { let handle thread::spawn(move || { map.insert(i, i * 2); }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } for pair in map.iter() { println!({}: {}, pair.key(), pair.value()); } }六、异步并发6.1 使用tokio进行异步编程use tokio; #[tokio::main] async fn async_concurrent() { let task1 tokio::spawn(async { println!(Task 1 started); tokio::time::sleep(std::time::Duration::from_millis(100)).await; println!(Task 1 completed); 1 }); let task2 tokio::spawn(async { println!(Task 2 started); tokio::time::sleep(std::time::Duration::from_millis(50)).await; println!(Task 2 completed); 2 }); let (result1, result2) tokio::join!(task1, task2); println!(Results: {}, {}, result1.unwrap(), result2.unwrap()); }6.2 异步安全use tokio::sync::Mutex; use std::sync::Arc; async fn async_mutex() { let counter Arc::new(Mutex::new(0)); let mut handles Vec::new(); for _ in 0..10 { let counter Arc::clone(counter); let handle tokio::spawn(async move { let mut num counter.lock().await; *num 1; }); handles.push(handle); } for handle in handles { handle.await.unwrap(); } println!(Counter: {}, *counter.lock().await); }七、总结Rust的并发安全特点编译时检查Send/Sync trait在编译时保证线程安全所有权系统避免数据竞争丰富的同步原语Mutex、RwLock、Condvar等原子操作无锁编程支持异步并发原生异步运行时支持在实际项目中建议使用标准库的同步原语处理简单场景使用crossbeam处理复杂的并发模式使用dashmap等第三方库进行高性能并发数据访问优先使用异步编程提高吞吐量思考在你的Rust项目中并发编程的最大挑战是什么欢迎分享

相关文章:

Rust并发安全模式:从线程安全到无锁编程

Rust并发安全模式:从线程安全到无锁编程 引言 并发编程是后端开发的核心挑战之一。Rust通过所有权系统和类型安全,在编译时保证并发安全,避免了数据竞争等常见问题。 本文将深入探讨Rust中的并发安全模式,包括线程同步、无锁编程、…...

昇腾CANN/TensorFlow MemoryConfig构造函数

MemoryConfig构造函数 【免费下载链接】tensorflow Ascend TensorFlow Adapter 项目地址: https://gitcode.com/cann/tensorflow 功能说明 MemoryConfig类的构造函数,用于配置系统内存使用方式。 函数原型 class MemoryConfig():def __init__(self,atomic…...

CANN/driver设备故障码查询API

dcmi_get_device_errorcode_v2 【免费下载链接】driver 本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。 项目地址: https://gitcode.com/cann/driver 函数原型 int dcmi_get_device_errorcode_v2(int card_id, …...

2025最权威的五大AI论文网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 处于学术论文写作范畴内的人工智能,其应用正愈发广泛,它的核心价值展…...

ARMv8内存管理机制与地址转换详解

1. ARMv8内存管理架构概述在AArch64执行状态下,ARMv8架构的内存管理单元(MMU)采用了两阶段地址转换机制(Stage 1 Stage 2),为虚拟化环境提供了灵活的地址转换方案。Stage 1转换由虚拟机操作系统控制&#…...

IEEE 802.11az安全Wi-Fi测距技术解析与应用

1. IEEE 802.11az/bk安全Wi-Fi测距技术深度解析Wi-Fi网络早已超越单纯的通信功能,成为室内定位和距离测量的重要基础设施。想象一下这样的场景:当你走进智能家居环境,灯光自动调节到舒适亮度;在大型商场里,导航系统精准…...

数字幅度调制器原理与3dB耦合器应用解析

1. 数字幅度调制器原理概述数字幅度调制器(Digital Amplitude Modulator)是一种革命性的射频信号处理技术,它通过数字化手段实现了传统模拟调制难以企及的高线性度和高效率。这项技术的核心创新在于将模拟调制过程分解为离散的数字控制步骤,从而规避了传…...

CANN/driver获取能力组信息API

dcmi_get_capability_group_info 【免费下载链接】driver 本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。 项目地址: https://gitcode.com/cann/driver 函数原型 int dcmi_get_capability_group_info(int card_…...

基于LLM+RAG的动态本体生成:从概念到工程实践

1. 项目概述:当大语言模型遇上动态本体生成 最近在知识图谱和智能信息处理领域,一个名为“DRAGON-AI”的项目引起了我的注意。它试图解决一个困扰业界多年的老问题:如何让机器自动、高效且动态地构建和理解一个领域内的概念体系,也…...

CANN/cann-bench: 3D卷积滤波器梯度算子

Conv3DBackpropFilter 算子 API 描述 【免费下载链接】cann-bench 评测AI在处理CANN领域代码任务的能力,涵盖算子生成、算子优化等领域,支撑模型选型、训练效果评估,统一量化评估标准,识别Agent能力短板,构建CANN领域评…...

CANN/runtime回调机制示例

0_simple_callback 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 描述 本样例展示了如何为同一个 Stream 同时注册 Report 回调线程和 HostFunc 处理线程,并通过 aclrtLaunchCallback 与…...

AI模型评估中的规范过拟合:超越基准测试的实战应对策略

1. 项目概述:当“标准答案”成为陷阱在AI模型开发这条路上,我们常常会听到一个词:过拟合。大家的第一反应通常是模型在训练集上表现完美,在测试集上却一塌糊涂,这是典型的“数据过拟合”。但今天我想聊一个更隐蔽、更棘…...

基于DenseNet201的实时手语识别系统:从数据构建到工程部署全流程解析

1. 项目概述与核心价值手语是听障人士与世界沟通的桥梁,但掌握它对于健听人士而言存在门槛,而实时翻译服务又往往成本高昂、难以普及。作为一名长期关注技术普惠性的开发者,我一直想探索如何利用唾手可得的计算设备——比如一台普通的笔记本电…...

脉冲神经网络:从决策到共情的多层级类脑智能实现

1. 项目概述:当机器开始“思考”与“感受”最近几年,AI圈子里最火的话题,除了大语言模型,恐怕就是“类脑智能”了。大家不再满足于让机器仅仅完成模式识别或数据拟合,而是希望它能像生物大脑一样,具备学习、…...

CANN/HCCL算法分析器使用指南

算法分析器使用指导 【免费下载链接】hccl 集合通信库(Huawei Collective Communication Library,简称HCCL)是基于昇腾AI处理器的高性能集合通信库,为计算集群提供高性能、高可靠的通信方案 项目地址: https://gitcode.com/cann…...

UVa 189 Pascal Program Lengths

题目分析 本题要求计算 Turbo Pascal\texttt{Turbo Pascal}Turbo Pascal 程序的长度,长度由若干类 token\texttt{token}token 的数量决定,包括: 保留字(reserved words\texttt{reserved words}reserved words)标识符&a…...

AI高通量实验平台:数据驱动电池级碳酸锂工艺优化

1. 项目概述:当AI遇见“白色石油”的提纯革命电池级碳酸锂,这个被誉为“白色石油”的关键材料,其生产工艺的每一次微小优化,都牵动着整个新能源产业链的神经。传统的工艺优化,往往依赖于工程师的经验和“试错法”&…...

CANN ops-tensor Blaze引擎

Blaze 【免费下载链接】ops-tensor ops-tensor 是 CANN (Compute Architecture for Neural Networks)算子库中提供张量类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。 项目地址: https://gitcode.com/cann/ops-…...

UVa 188 Perfect Hash

题目分析 本题要求为给定的单词列表构造一个完美哈希函数,函数形式为: ⌊Cw⌋ mod n \left\lfloor \frac{C}{w} \right\rfloor \bmod n ⌊wC​⌋modn 其中: www 是单词转换后的整数值(转换规则:每个字母用 555 位表示…...

长期使用中观察到的Taotoken账单明细与成本分析价值

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用中观察到的Taotoken账单明细与成本分析价值 在将大模型能力集成到产品或研发流程的长期实践中,一个清晰、可追…...

联邦学习与Transformer在CV与安全领域的融合应用与实战解析

1. 项目概述:当联邦学习遇上Transformer,CV与安全的新范式最近几年,我身边不少做计算机视觉(CV)和网络安全的朋友,都在不约而同地讨论两个词:联邦学习(Federated Learning&#xff0…...

信贷风控中可解释AutoML实践:用SHAP与H2O实现透明AI决策

1. 项目概述:当信贷决策遇上“透明”的AI在金融科技圈子里干了十几年,我亲眼见证了机器学习从实验室里的新奇玩具,变成信贷风控部门里不可或缺的“主力队员”。无论是银行、消费金融公司还是新兴的金融科技平台,都在用算法模型来评…...

基于SVR与特征选择的系外行星半径预测:数据清洗、模型构建与天文解读

1. 项目概述:从数据到洞察,预测遥远世界的尺寸在系外行星研究的浩瀚星海中,我们获取的数据往往是间接且充满噪声的。当一颗行星从它的母恒星前方经过,我们称之为“凌星”,望远镜会记录下恒星亮度的微小下降。从这些“光…...

不同价位的燕窝品质差异大吗?行业标准解读与选购建议

不同价位的燕窝品质差异大吗?答案是确实存在较为明显的客观差异,价格落差主要对应原料等级、加工工艺、安全溯源三个核心维度的区别,合理的价格差对应品质差,但也存在部分营销溢价,消费者需要学会区分核心指标。不同价…...

第五篇:锻造大脑——为什么算法公开,你却造不出 GPT?

书接上文。同学问:“既然 CNN、Transformer 的论文和代码都是开源的,我能不能在寝室里手搓一个 DeepSeek 或者 GPT-4?” 这就像虽然米其林餐厅的菜谱(算法)是公开的,但要把菜做成艺术品,你还需要…...

非洲AI本土化实践:医疗、农业、金融、教育四大领域创新与挑战

1. 非洲AI发展的现实图景:机遇与挑战并存 谈论人工智能,我们常常将目光聚焦在硅谷、北京或伦敦。但如果你把视线转向非洲大陆,会发现一片截然不同却又充满生机的AI创新土壤。这里没有OpenAI或DeepMind那样的科技巨头,却有着一群直…...

基于主动学习的广义Benders分解算法初始化优化研究

1. 项目概述:当优化算法遇上“主动学习”在运筹优化和工业工程领域,我们常常需要面对一类“硬骨头”问题:大规模、混合整数、带有复杂约束的优化模型。这类问题大到供应链网络设计,小到芯片布局布线,其核心挑战在于&am…...

CANN/tensorflow NPURunConfig精度调优配置

精度调优 【免费下载链接】tensorflow Ascend TensorFlow Adapter 项目地址: https://gitcode.com/cann/tensorflow precision_mode_v2 算子精度模式,配置要求为string类型。 fp16:表示原图中算子精度为float16、bfloat16或float32时&#xff0c…...

CANN/cann-recipes-infer:NPU DeepSeek-V4 TileLang算子开发实践

NPU DeepSeek-V4 TileLang算子开发实践 【免费下载链接】cann-recipes-infer 本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-infer 简介 在大模型异构计算发展背景…...

CANN/pyasc ib_wait函数文档

asc.language.basic.ib_wait 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口,支持在昇腾AI处理器上加速计算,接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitcode.com/cann/pyasc asc.language.basic.ib_wait(g…...