主要观点:Rust 为多线程处理器世界而构建,std
的一些集合等在构建实际程序时可能不够,DashMap
很受欢迎但可能导致死锁,虽有建议避免在异步代码中锁定但文档未提及,即使代码未在await
点锁定也会出现死锁情况,目前解决办法是用其他库替代DashMap
,如scc
等,作者写此文旨在提醒使用DashMap
的人注意该严重问题。
关键信息:
- Rust 的核心所有权强制模型及
Sync
+Send
类型可确保线程间内存安全,std
的集合等在实际编程中可能不足。 DashMap
受欢迎,有 5200 万下载量,但可能导致死锁且编译器无法检测。- 死锁原因是多线程对同一内存的访问及锁的不合理使用,
DashMap
允许在await
点持有锁导致编译器无法判断是否会死锁。 - 最佳建议是不在异步代码中锁定
DashMap
,但文档未提及,实际代码即使未在await
点锁定也会出现死锁,调试和研究后需用其他库替代DashMap
。
重要细节: - 从 2021 年问题就已存在,大部分避免锁的想法暂被放弃,不知何时能解决。
- 作者写此文非诋毁
DashMap
作者等,而是提醒使用者该库的严重问题,避免后续更新引入死锁。 - 2024 年 4 月 1 日编辑文章以提高清晰度并根据反馈删除误导性引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。