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


Rust AtomicU64.fetch_update用法及代碼示例


本文簡要介紹rust語言中 std::sync::atomic::AtomicU64.fetch_update 的用法。

用法

pub fn fetch_update<F>(    &self,     set_order: Ordering,     fetch_order: Ordering,     f: F) -> Result<u64, u64> where    F: FnMut(u64) -> Option<u64>,

獲取該值,並對其應用一個返回可選新值的函數。如果函數返回 Some(_) ,則返回 Ok(previous_value)Result ,否則返回 Err(previous_value)

注意:如果同時其他線程更改了該值,則可能會多次調用該函數,隻要該函數返回 Some(_) ,但該函數隻會對存儲的值應用一次。

fetch_update 采用兩個 Ordering 參數來說明此操作的內存順序。第一個說明了操作最終成功時所需的順序,而第二個說明了加載所需的順序。這些分別對應 AtomicU64::compare_exchange 的成功和失敗順序。

使用 Acquire 作為成功排序使存儲成為此操作的一部分 Relaxed ,使用 Release 使最終成功加載 Relaxed 。 (失敗的)加載排序隻能是 SeqCst Acquire Relaxed ,並且必須等於或弱於成功排序。

注意:此方法僅適用於支持原子操作的平台u64.

例子

use std::sync::atomic::{AtomicU64, Ordering};

let x = AtomicU64::new(7);
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |_| None), Err(7));
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(7));
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(8));
assert_eq!(x.load(Ordering::SeqCst), 9);

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 std::sync::atomic::AtomicU64.fetch_update。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。