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

30|浑然一体,一气呵成:atomic原子操作 (下)

你好,我是鸟窝。
前面两节课,我们已经了解了原子操作的背景知识以及五种内存序的类型,标准库中 12 种原子类型以及它们非常多的原子方法。atomic 模块中的内容比较多,所以我们还得再开一节才能学习完它的相关知识。
在这节课中,我们先来了解两个底层的和屏障(fence)相关的函数,然后学习原子类型应用的场景。

两个函数

atomic 模块还提供了 fencecompiler_fence 两个函数。其实还有一个 spin_loop_hint 函数,但是这个函数自 Rust 1.51.0 就废弃了。

fence

屏障 (Fence) 在其自身与其他线程中的原子操作或屏障之间建立同步。为实现这一点,屏障会阻止编译器和 CPU 对其周围特定类型的内存操作进行重排序。
读写多线程场景下,Acquire 语义和 Release 语义常常配套使用。
下面我们举一个利用屏障在线程间同步的例子。
Thread 1 是写线程
它使用 Release 语义屏障 A
它有写操作 X
Thread 2 是读线程
它使用 Acquire 语义屏障 B
它有读操作 Y
两个线程同步操作同一个原子类型 M
以上是背景介绍,接下来让我们理解官方文档中这段话和示意图:
一个具有(至少)Release 语义的屏障 A,与一个具有(至少)Acquire 语义的屏障 B 进行同步: 当且仅当存在操作 XY(两者都作用于某个原子对象 ‘M’),使得 A 按序排在 X 之前(A is sequenced before X),Y 按序排在 B 之前(Y is sequenced before B),并且 Y 观测到了 M 的变化(Y observes the change to M)。这就在 A 和 B 之间提供了一个 “happens-before” 的依赖关系。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. `atomic`模块提供了`fence`和`compiler_fence`函数,用于建立同步和防止内存重排序。 2. `fence`函数用于在不同线程的原子操作或屏障之间建立同步,通过指定内存序参数来控制同步行为。 3. `compiler_fence`函数是针对编译器的原子屏障,用于在同一线程内的操作建立同步,防止内存重排序。 4. 原子操作适用于构建更复杂的并发原语和系统,常见应用场景包括原子标志位和原子计数器。 5. 原子标志位可用于线程间简单的状态通知,例如主线程通知工作子线程停止。 6. 原子计数器适合统计事件发生次数、管理资源引用计数等,通过原子递增操作实现。 7. 在使用原子操作时,需要注意选择适当的内存序参数来确保正确的同步行为。 8. 原子操作的应用场景丰富多样,可以根据具体需求选择合适的原子类型和操作方法。 9. 使用`Acquire`或`SeqCst`内存序参数可以确保对所有线程的最终写入进行观察,保证数据的一致性和可见性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《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
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)