pub fn spin_loop()
Expand description
发出一条机器指令,以向处理器发送信号,指示其正在忙于等待的自旋循环 (自旋锁) 中运行。
在接收到自旋环信号后,处理器可以通过例如节省功率或切换 hyper 线程来优化其行为。
此函数不同于 thread::yield_now
,后者直接产生系统的调度程序,而 spin_loop
不与操作系统交互。
spin_loop
的一个常见用例是在同步原语的 CAS 循环中实现有界乐观旋转。
为避免优先级倒置之类的问题,强烈建议在有限次数的迭代后终止旋转循环,并进行适当的阻塞系统调用。
Note: 在不支持接收自旋循环提示的平台上,此函数完全不执行任何操作。
Examples
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::{hint, thread};
// 线程将用于协调的共享原子值
let live = Arc::new(AtomicBool::new(false));
// 在后台线程中,我们最终将设置该值
let bg_work = {
let live = live.clone();
thread::spawn(move || {
// 做一些工作,然后创造值
do_some_work();
live.store(true, Ordering::Release);
})
};
// 回到我们当前的线程,我们等待该值被设置
while !live.load(Ordering::Acquire) {
// 自旋循环是对我们正在等待的 CPU 的提示,但可能不会持续很长时间
hint::spin_loop();
}
// 现在设置该值
do_some_work();
bg_work.join()?;
Run