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

你好,我是鸟窝。
前面两节课,我们已经了解了原子操作的背景知识以及五种内存序的类型,标准库中 12 种原子类型以及它们非常多的原子方法。atomic 模块中的内容比较多,所以我们还得再开一节才能学习完它的相关知识。
在这节课中,我们先来了解两个底层的和屏障(fence)相关的函数,然后学习原子类型应用的场景。
两个函数
atomic 模块还提供了 fence 和 compiler_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 进行同步: 当且仅当存在操作 X 和 Y(两者都作用于某个原子对象 ‘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
《Rust 并发编程实战课》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论