Function std::hint::spin_loop

1.49.0 · source ·
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