本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。