【Rust的2种线程锁 阻塞 vs 挂起】

news/2025/1/18 12:27:51/

async_std::sync::Mutexstd::sync::Mutex 之间的主要区别在于它们如何处理线程阻塞和异步编程模型。以下是两者的关键差异:

标准库的 Mutex (std::sync::Mutex)
  1. 同步阻塞:当一个线程尝试获取 std::sync::Mutex 的锁时,如果锁已经被其他线程持有,调用线程将会被阻塞,直到锁变得可用。这意味着该线程将暂停执行,直到它获得锁。

  2. 线程安全std::sync::Mutex 是线程安全的,可以在多个线程之间共享,并确保同一时间只有一个线程能够访问受保护的数据。

  3. 非异步友好:由于它会阻塞线程,因此在异步环境中使用 std::sync::Mutex 可能会导致性能问题,因为被阻塞的线程不能继续执行其他任务,浪费了线程资源。

  4. 适用场景:适用于传统的多线程环境,特别是当你可以接受或需要线程阻塞的情况。

async-std 的 Mutex (async_std::sync::Mutex)
  1. 异步非阻塞async_std::sync::Mutex 设计为与异步/等待(async/await)模式一起工作。当一个任务尝试获取锁时,如果锁不可用,该任务不会阻塞线程,而是会被挂起(suspended),允许其他任务在同一线程上运行。一旦锁变为可用,任务就会被唤醒并继续执行。

    线程阻塞(Blocked)和线程挂起(Suspended)的主要区别在于原因和恢复机制:

    • 线程阻塞:线程因为等待某个事件(如 I/O 操作完成、锁的释放等)而暂停执行,不能立即继续运行。阻塞的线程通常会进入等待队列,直到它等待的事件发生
    • 线程挂起:线程被人为地暂停执行,但不是因为等待某个外部事件。挂起可以是由于调度器决定让其他线程运行,或者是由程序显式调用某些 API 使当前线程暂停。挂起的线程可以在任何时候由系统 或程序恢复。
  2. 线程安全:同样,async_std::sync::Mutex 也是线程安全的,可以在多个线程中共享,保证同一时间只有一个任务可以访问受保护的数据。

  3. 异步友好:它是专门为异步编程设计的,避免了因等待锁而导致的任务阻塞,使得线程可以更高效地利用起来。

  4. 适用场景:适用于异步编程环境,特别是在你使用 async-std 或者其他的异步运行时来构建高并发应用程序时。

使用
std::sync::Mutex
rust">use std::sync::{Arc, Mutex};
use std::thread;fn main() {let counter = Arc::new(Mutex::new(0));let mut handles = vec![];for _ in 0..10 {let counter_clone = Arc::clone(&counter);let handle = thread::spawn(move || {let mut num = counter_clone.lock().unwrap();*num += 1;});handles.push(handle);}for handle in handles {handle.join().unwrap();}println!("Final counter value: {}", *counter.lock().unwrap());
}
async_std::sync::Mutex
rust">use async_std::sync::{Arc, Mutex};
use async_std::task;#[async_std::main]
async fn main() {let counter = Arc::new(Mutex::new(0));let mut handles = vec![];for _ in 0..10 {let counter_clone = Arc::clone(&counter);let handle = task::spawn(async move {let mut num = counter_clone.lock().await;*num += 1;});handles.push(handle);}for handle in handles {handle.await;}println!("Final counter value: {}", *counter.lock().await);
}
总结

选择 std::sync::Mutex 还是 async_std::sync::Mutex 主要取决于你的应用是否采用了异步编程模型。如果你的应用是基于异步/等待模式构建的,并且你希望避免因锁竞争导致的任务阻塞,那么你应该选择 async_std::sync::Mutex。对于传统的多线程应用,或者当你不介意线程阻塞时,std::sync::Mutex 仍然是一个合适的选择。


http://www.ppmy.cn/news/1564147.html

相关文章

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)

个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库&…

react native学习【6.1】——列表视图

react native学习【6.1】——列表视图 官方文档官方文档链接具体内容FlatList & SectionList 具体操作1)移动文件2)修改_layout.tsx文件删除导入语句添加导入语句修改并添加具体的代码语句对报错语句进行修改最终的_layout.tsx文件的代码 3&#xf…

Starrocks 开启 Ranger 权限认证支持

Starrocks 开启 Ranger 权限认证支持 SR 支持版本 : 3.1.9 及以后版本,Ranger 版本 2.1 及以后版本 Ranger Apache Ranger 提供了一个集中式的安全管理框架,用户可以通过可视化的 Web 页面来定制各种访问策略,决定哪些角色能访问哪些数据&…

Day38补20250117代码随想录动态规划6 322.零钱兑换|279.完全平方数|139.单词拆分|多重背包问题|总结

Day38补20250117代码随想录动态规划6 322.零钱兑换|279.完全平方数|139.单词拆分|多重背包问题|总结 【多重背包问题】稍微了解了一下,没有具体敲代码 322.零钱兑换 题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amoun…

海康MV-EB435i立体相机SDK安装(ROS 2)

文章目录 一、简介二、驱动配置小结 一、简介 MV-EB435i相机是一款低成本、小体积、配置全面的立体相机,凭借硬件级的深度图像处理方案,相机可在高性能输出的同时维持低功耗的水平。相机采用海康MV3D SDK,并提供跨平台支持,广泛应…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路: 攻击外网服务器,获取外网服务器的权限,接着利用入侵成功的外网服务器作为跳板,攻击内网其他服务器,最后获得敏感数据,并将数据传递到攻击者&#xff0…

2025年第三届“华数杯”国际赛A题解题思路与代码(Python版)

游泳竞技策略优化模型代码详解 第一题:速度优化模型 在这一部分,我们将详细解析如何通过数学建模来优化游泳运动员在不同距离比赛中的速度分配策略。 1. 模型概述 我们的模型主要包含三个核心文件: speed_optimization.py: 速度优化的核…

2025年供应链攻击或成企业主要威胁

2024年由于网络安全领域的活动显著增加,网络威胁动态性和数字攻击面不断扩大,预计2025年企业将面临更大的网络攻击挑战。 安全专家预测,在众多形式的网络攻击中,供应链攻击正成为一种日益严重的安全隐患,它通过渗透企…