如何仅使用一个互斥锁在 Rust 中使 Tokio 应用程序死锁?

主要观点:Rust 对基于futures 和 async/await的异步编程支持良好,Futures 是 Rust 核心语言的一部分但需运行时执行,Tokio 是当前 Rust 社区最流行的运行时,Turso 也在使用它且最近遇到与 Tokio 相关的有趣问题,一个仅使用单个互斥锁的代码出现死锁,经 Nikita Sivukhin 努力创建了最小重现器并修复了问题,原代码会出现死锁是因为异步任务获取锁后立即释放,同步任务获取锁后在等待未来时保持锁且该未来不使用互斥锁,可通过使用 tokio::sync::Mutex 代替 std::sync::Mutex 来修复该问题,Tokio 文档本身鼓励在基于 Tokio 的代码中使用 std::sync::Mutex 因其性能原因,此经历的教训是并发编程不易需特别注意,默认应使用 tokio::sync::Mutex 除非证明是性能瓶颈,Rust 文档常鼓励使用高级性能优化技术但可能并非最佳选择。

关键信息:Rust 异步编程相关工具及运行时介绍,出现死锁的代码及原因,修复死锁的方法及相关讨论,Tokio 文档的相关建议及教训。

重要细节:给出出现死锁的代码示例,包括异步任务和同步任务的操作,以及使用不同互斥锁时的代码对比,解释了使用 std::sync::Mutex 的原因及默认情况下应使用 tokio::sync::Mutex 的观点等。

阅读 8
0 条评论