tokio::sync::Mutex 与 std::sync::Mutex
代码useanyhow::{Ok,Result};usestd::{ptr::read,sync::Arc,time::Duration};usetokio::sync::Mutex;structDB;implDB{// 假装在 commit 数据asyncfncommit(mutself)-Resultusize{Ok(42)}}#[tokio::main]asyncfnmain()-Result(){letdb1Arc::new(Mutex::new(DB));letdb2Arc::clone(db1);tokio::spawn(asyncmove{letmutdbdb1.lock().await;// 因为拿到的 MutexGuard 要跨越 await , 所以不能用 std::sync::Mutex// 只能用 tokio::sync::Mutexletaffecteddb.commit().await?;println!(db1: Total affected rows: {},affected);letresult:Result_,anyhow::ErrorOk(());result});tokio::spawn(asyncmove{letmutdbdb2.lock().await;letaffecteddb.commit().await?;println!(db2: Total affected rows: {},affected);letresult:Result_,anyhow::ErrorOk(());result});// 让两个task 有机会执行完tokio::time::sleep(Duration::from_millis(1)).await;Ok(())}在异步 Rust 中使用tokio::sync::Mutex而不是std::sync::Mutex的核心原因是std::sync::MutexGuard不是Send的, 而tokio的MutexGuard是Send的。为什么普通的 MutexGuard 编译会出错工作窃取work-stealing调度tokio默认使用多线程运行时任务Future可能在线程之间迁移被窃取。这意味着一个 Future 可能在线程 A 上开始执行遇到 .await 后挂起然后被调度到线程 B 上继续执行。std::sync::MutexGuard 不是 Sendstd::sync::MutexGuard 内部包含对当前线程特定资源的引用它被设计为不能安全地在线程间传递即它没有实现 Send trait。如果你的代码在 .await 之前获取了 std::sync::MutexGuard然后在 .await 之后继续使用它那么在.await点任务可能被调度到另一个线程。此时MutexGuard会随任务一起被“移动”到新线程但MutexGuard不是Send这违反了 Rust 的所有权规则编译器会直接报错。编译器错误示例usestd::sync::Mutex;asyncfnexample(){letlockMutex::new(0);letguardlock.lock().unwrap();// 获取 MutexGuardtokio::time::sleep(Duration::from_secs(1)).await;// .await 点println!({},*guard);// 这里可能会在不同线程继续执行}编译器会报告类似error: future cannot be sent between threads safely note: std::sync::MutexGuard_, u32 is not Sendtokio::sync::Mutex 的解决方案tokio::sync::Mutex::lock() 返回一个 Future它会异步等待锁不会阻塞当前线程。它返回的 MutexGuard 实现了 Send因此可以安全地跨 .await 点被传递到其他线程。这样你就可以在异步函数中安全地持有一个锁并跨越 .await 点。注意事项性能tokio::sync::Mutex 比 std::sync::Mutex 有更高的开销因为它需要异步等待和唤醒机制。使用场景如果临界区很短并且不需要跨越 .await建议使用 std::sync::Mutex因为它更快且无异步开销。如果需要在 .await 期间保持锁如你的例子中db.commit().await 在锁内执行则必须使用 tokio::sync::Mutex。

相关新闻

3分钟学会本地解密微信聊天记录:你的数字记忆保险箱

3分钟学会本地解密微信聊天记录:你的数字记忆保险箱

3分钟学会本地解密微信聊天记录:你的数字记忆保险箱 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信聊天记录里藏着太多珍贵回忆,但你是否曾因手机损坏、误删记录或数据迁移失…

2026/7/24 21:54:51阅读更多 →
中兴光猫工厂模式终极解锁指南:zteOnu工具深度实战

中兴光猫工厂模式终极解锁指南:zteOnu工具深度实战

中兴光猫工厂模式终极解锁指南:zteOnu工具深度实战 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 想象一下,你正面对着家中的中兴光猫,想要调整一些…

2026/7/24 21:52:50阅读更多 →
终极AMD Ryzen性能调优指南:免费调试工具完全攻略

终极AMD Ryzen性能调优指南:免费调试工具完全攻略

终极AMD Ryzen性能调优指南:免费调试工具完全攻略 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…

2026/7/24 21:52:50阅读更多 →
AI 电动圣诞旋转音乐盒智能功率 MOSFET 精准选型方案

AI 电动圣诞旋转音乐盒智能功率 MOSFET 精准选型方案

随着 AI 技术融入节日产品(如智能灯光律动、自适应音乐、电机精准启停),电动圣诞音乐盒对功率 MOSFET 提出新要求:高集成度、低功耗、逻辑电平驱动、小封装。微碧半导体(VBsemi)基于 Trench、SGT 工艺&…

2026/7/25 6:34:22阅读更多 →
AI 电动圣诞袜智能功率 MOSFET 完整选型方案

AI 电动圣诞袜智能功率 MOSFET 完整选型方案

2026年随着 AI 技术在圣诞袜中的深度渗透(如智能照明、动态效果、交互控制),对功率 MOSFET 提出更高要求:高频化、低损耗、高集成度。微碧半导体(VBsemi)基于 Trench 工艺,为您提供覆盖主驱动、…

2026/7/25 6:34:22阅读更多 →
AI 电动圣诞树旋转灯座智能功率 MOSFET 完整选型方案

AI 电动圣诞树旋转灯座智能功率 MOSFET 完整选型方案

随着 AI 技术在智能家居与节日装饰中的普及(如声光联动、智能温控、动态模式),圣诞树旋转灯座对功率 MOSFET 提出新要求:低功耗、高集成度、逻辑电平驱动、高可靠性。微碧半导体(VBsemi)基于先进的 Trench …

2026/7/25 6:34:22阅读更多 →
大模型技术全景解析与开发实战指南

大模型技术全景解析与开发实战指南

1. 大模型技术全景解析:为什么每个开发者都该关注过去三年,大模型技术以每月都有突破性进展的速度重塑着技术生态。作为深度参与过多个企业级大模型落地的技术顾问,我亲眼见证了一个个团队从"这玩意儿能干啥"的疑惑,到&…

2026/7/25 6:34:22阅读更多 →
AI 电动圣诞树旋转灯智能灯光与电机驱动 MOSFET 完整选型方案

AI 电动圣诞树旋转灯智能灯光与电机驱动 MOSFET 完整选型方案

随着 AI 技术在智能装饰与互动娱乐领域的应用(如声光联动、动态追光、无线集群控制),电动圣诞树旋转灯对功率 MOSFET 提出更高要求:高效率、低功耗、小体积、高可靠性。微碧半导体(VBsemi)基于先进的 Trenc…

2026/7/25 6:34:22阅读更多 →
ARM Cortex-M4F微控制器实战指南:从内核到外设的嵌入式开发精要

ARM Cortex-M4F微控制器实战指南:从内核到外设的嵌入式开发精要

1. 从数据手册到实战:如何真正玩转一颗ARM Cortex-M4F微控制器如果你是一位嵌入式开发者,或者正在学习嵌入式系统,那么“微控制器数据手册”这个词对你来说一定不陌生。它通常是一份动辄上千页的PDF,充满了寄存器地址、时序图和电…

2026/7/25 6:32:21阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →