- 示例代码:
use std::sync::atomic::{AtomicUsize, Ordering};
fn main() {
let data = AtomicUsize::new(0);
let flag = AtomicUsize::new(0);
let data_copy = data.load(Ordering::Relaxed);
flag.store(1, Ordering::Release);
while flag.load(Ordering::Acquire) == 0 {
std::thread::yield_now();
}
let new_data = data.load(Ordering::Relaxed);
assert!(new_data >= data_copy);
}
- 同步顺序保证解释:
- 释放(Release)顺序:
flag.store(1, Ordering::Release);
这行代码使用 Ordering::Release
顺序存储值。当一个线程以 Release
顺序存储一个值时,它保证在此之前对内存的所有写入(这里是 data
的读取操作 let data_copy = data.load(Ordering::Relaxed);
)对其他以 Acquire
顺序读取该值的线程是可见的。
- 获取(Acquire)顺序:
while flag.load(Ordering::Acquire) == 0 {
这行代码使用 Ordering::Acquire
顺序加载值。当一个线程以 Acquire
顺序加载一个值时,它保证在此之后对内存的所有读取(这里是 data
的读取操作 let new_data = data.load(Ordering::Relaxed);
)能看到在释放线程中 Release
顺序存储之前的所有写入操作。所以在 Acquire
加载 flag
之后读取 data
,能保证看到 data
在 Release
存储 flag
之前的状态,从而实现了简单的释放和获取顺序同步。