Function core::hint::spin_loop 1.49.0[−][src]
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