本文簡要介紹rust語言中 std::sync::atomic::AtomicPtr.fetch_update
的用法。
用法
pub fn fetch_update<F>( &self, set_order: Ordering, fetch_order: Ordering, f: F) -> Result<*mut T, *mut T> where F: FnMut(*mut T) -> Option<*mut T>,
獲取該值,並對其應用一個返回可選新值的函數。如果函數返回 Some(_)
,則返回 Ok(previous_value)
的 Result
,否則返回 Err(previous_value)
。
注意:如果同時其他線程更改了該值,則可能會多次調用該函數,隻要該函數返回 Some(_)
,但該函數隻會對存儲的值應用一次。
fetch_update
采用兩個 Ordering
參數來說明此操作的內存順序。第一個說明了操作最終成功時所需的順序,而第二個說明了加載所需的順序。這些分別對應 AtomicPtr::compare_exchange
的成功和失敗順序。
使用 Acquire
作為成功排序使存儲成為此操作的一部分 Relaxed
,使用 Release
使最終成功加載 Relaxed
。 (失敗的)加載排序隻能是 SeqCst
、 Acquire
或 Relaxed
,並且必須等於或弱於成功排序。
注意:此方法僅在支持指針原子操作的平台上可用。
例子
use std::sync::atomic::{AtomicPtr, Ordering};
let ptr: *mut _ = &mut 5;
let some_ptr = AtomicPtr::new(ptr);
let new: *mut _ = &mut 10;
assert_eq!(some_ptr.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |_| None), Err(ptr));
let result = some_ptr.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| {
if x == ptr {
Some(new)
} else {
None
}
});
assert_eq!(result, Ok(ptr));
assert_eq!(some_ptr.load(Ordering::SeqCst), new);
相關用法
- Rust AtomicPtr.from_mut用法及代碼示例
- Rust AtomicPtr.compare_exchange_weak用法及代碼示例
- Rust AtomicPtr.new用法及代碼示例
- Rust AtomicPtr.into_inner用法及代碼示例
- Rust AtomicPtr.swap用法及代碼示例
- Rust AtomicPtr.compare_and_swap用法及代碼示例
- Rust AtomicPtr.store用法及代碼示例
- Rust AtomicPtr.get_mut用法及代碼示例
- Rust AtomicPtr.load用法及代碼示例
- Rust AtomicPtr.compare_exchange用法及代碼示例
- Rust AtomicU8.fetch_sub用法及代碼示例
- Rust AtomicU32.fetch_min用法及代碼示例
- Rust AtomicI8.fetch_or用法及代碼示例
- Rust AtomicI8.as_mut_ptr用法及代碼示例
- Rust AtomicU8.fetch_or用法及代碼示例
- Rust AtomicUsize.load用法及代碼示例
- Rust AtomicI16.fetch_min用法及代碼示例
- Rust AtomicI16.fetch_and用法及代碼示例
- Rust AtomicU16.into_inner用法及代碼示例
- Rust AtomicI16.fetch_nand用法及代碼示例
- Rust AtomicI32.compare_exchange用法及代碼示例
- Rust AtomicU16.from_mut用法及代碼示例
- Rust AtomicI16.swap用法及代碼示例
- Rust AtomicU8.as_mut_ptr用法及代碼示例
- Rust AtomicBool.fetch_update用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::sync::atomic::AtomicPtr.fetch_update。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。