提防 DashMap 死锁

主要观点:Rust 为多线程处理器世界而构建,std的一些集合等在构建实际程序时可能不够,DashMap很受欢迎但可能导致死锁,虽有建议避免在异步代码中锁定但文档未提及,即使代码未在await点锁定也会出现死锁情况,目前解决办法是用其他库替代DashMap,如scc等,作者写此文旨在提醒使用DashMap的人注意该严重问题。
关键信息:

  • Rust 的核心所有权强制模型及Sync + Send类型可确保线程间内存安全,std的集合等在实际编程中可能不足。
  • DashMap受欢迎,有 5200 万下载量,但可能导致死锁且编译器无法检测。
  • 死锁原因是多线程对同一内存的访问及锁的不合理使用,DashMap允许在await点持有锁导致编译器无法判断是否会死锁。
  • 最佳建议是不在异步代码中锁定DashMap,但文档未提及,实际代码即使未在await点锁定也会出现死锁,调试和研究后需用其他库替代DashMap
    重要细节:
  • 从 2021 年问题就已存在,大部分避免锁的想法暂被放弃,不知何时能解决。
  • 作者写此文非诋毁DashMap作者等,而是提醒使用者该库的严重问题,避免后续更新引入死锁。
  • 2024 年 4 月 1 日编辑文章以提高清晰度并根据反馈删除误导性引用。
阅读 18
0 条评论