Rust 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
678 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已更新 35 讲/共 38 讲
Rust 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)