本文简要介绍rust语言中 Function std::hint::spin_loop
的用法。
用法
pub fn spin_loop()
发出机器指令以通知处理器它正在 busy-wait spin-loop (“spin lock”) 中运行。
在接收到spin-loop 信号后,处理器可以通过例如节能或切换hyper-threads 来优化其行为。
这个函数不同于 thread::yield_now
,它直接让给系统的调度程序,而spin_loop
不与操作系统交互。
spin_loop
的一个常见用例是在同步原语的 CAS 循环中实现有界乐观旋转。为避免优先级反转等问题,强烈建议在有限数量的迭代后终止自旋循环并进行适当的阻塞系统调用。
注意:在不支持接收 spin-loop 提示的平台上,此函数根本不执行任何操作。
例子
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::{hint, thread};
// A shared atomic value that threads will use to coordinate
let live = Arc::new(AtomicBool::new(false));
// In a background thread we'll eventually set the value
let bg_work = {
let live = live.clone();
thread::spawn(move || {
// Do some work, then make the value live
do_some_work();
live.store(true, Ordering::Release);
})
};
// Back on our current thread, we wait for the value to be set
while !live.load(Ordering::Acquire) {
// The spin loop is a hint to the CPU that we're waiting, but probably
// not for very long
hint::spin_loop();
}
// The value is now set
do_some_work();
bg_work.join()?;
相关用法
- Rust spawn用法及代码示例
- Rust split_paths用法及代码示例
- Rust str.make_ascii_uppercase用法及代码示例
- Rust slice.sort_unstable_by_key用法及代码示例
- Rust slice.iter_mut用法及代码示例
- Rust symlink用法及代码示例
- Rust slice.windows用法及代码示例
- Rust slice.repeat用法及代码示例
- Rust slice.group_by_mut用法及代码示例
- Rust slice.align_to_mut用法及代码示例
- Rust size_of用法及代码示例
- Rust slice.as_chunks_unchecked用法及代码示例
- Rust str.strip_suffix用法及代码示例
- Rust str.trim_left用法及代码示例
- Rust slice.fill用法及代码示例
- Rust slice.array_windows用法及代码示例
- Rust slice.sort_unstable_by用法及代码示例
- Rust slice.sort用法及代码示例
- Rust str.char_indices用法及代码示例
- Rust str.to_ascii_lowercase用法及代码示例
- Rust str用法及代码示例
- Rust slice.rotate_left用法及代码示例
- Rust slice.as_mut_ptr用法及代码示例
- Rust str.trim用法及代码示例
- Rust stringify用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::hint::spin_loop。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。