當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust AtomicPtr.fetch_update用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 std::sync::atomic::AtomicPtr.fetch_update。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。