31|包罗万象,风雨同舟:并发集合(上)
机器人

你好,我是鸟窝。
接下来的两节课程中,我们会详细学习并发编程常用的集合类型,如 map、vec 等标准库和第三库中的类型。之所以要单拎出来它们重点讲解,是因为我们大部分的并发程序中都会或多或少的使用到它们。
它们有的是几种同步原语的组合,有的是专门为并发场景单独实现,目的只有一个:为并发程序提供线程安全的集合类型。
这几节课中提到的库主要都是第三方库,主要还是为了开拓大家的视野,了解丰富的 Rust 生态圈千姿百态的 crate,即使你现在用不到它们,也不妨先了解一下。
线程安全的 map
写多线程代码的时候,经常会遇到需要让好几个线程都能访问甚至修改同一个数据集合的场景。比如,一个网络服务器可能需要一个全局的缓存,或者一个状态管理器,让不同的请求处理线程都能读写。这时候,HashMap 这种我们平时用得飞起的数据结构,就显得有点“脆弱”了。
为啥 std::collections::HashMap 在多线程里“不安全”?
很简单,Rust 标准库里的 HashMap 设计时就没考虑并发访问。想象一下:
线程 A 正在往 Map 里加一个新键值对,它可能需要重新分配内存、移动元素。
线程 B 同时想读取 Map 里的一个值。
线程 C 又想删除一个元素。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. Rust标准库中的HashMap在多线程环境中存在数据竞争问题,需要特定的同步工具来保证线程安全。 2. 使用Mutex+HashMap或RwLock+HashMap可以在多线程环境中实现线程安全的Map操作,但存在性能和锁粒度等问题。 3. 在读多写少的场景下,RwLock+HashMap比Mutex+HashMap性能更好,因为多个读线程可以并行。 4. dashmap库注重性能,提供易于使用的API,类似于std::collections::HashMap,但为处理并发性做了微小调整,采用分片或桶的方式提高并发度。 5. evmap库采用“读写分离”和“最终一致性”理念,在读密集型场景下具有极高的并发读性能。 6. papaya库适用于读取密集型工作负载的、快速且实用的并发哈希表,提供可预测且一致的延迟,适合读操作远远大于写操作的场景。 7. Rust的Vec在多线程环境下需要额外的同步机制来保证线程安全,可以使用Mutex或RwLock包裹Vec,并结合Arc在多线程中使用。 8. 使用Arc<Mutex<Vec>>或Arc<RwLock<Vec>>可以实现线程安全的Vec操作,RwLock适用于读多写少的场景。 9. 线程安全的Map和Vec操作需要根据具体场景选择合适的同步工具,以保证数据一致性和性能。 10. 第三方库提供了针对并发优化的Map实现,如dashmap、evmap和papaya,可以根据需求选择合适的库来提高并发性能。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》,新⼈⾸单¥98
《Rust 并发编程实战课》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论