pub struct AtomicF64 { /* private fields */ }Expand description
Atomic 64-bit floating point number.
Provides easy-to-use atomic operations with automatic memory ordering
selection. Implemented using AtomicU64 with bit conversion.
§Memory Ordering Strategy
This type uses the same memory ordering strategy as atomic integers:
-
Read operations (
load): UseAcquireordering to ensure visibility of prior writes from other threads. -
Write operations (
store): UseReleaseordering to ensure visibility of prior writes to other threads. -
Read-Modify-Write operations (
swap,compare_set): UseAcqRelordering for full synchronization. -
CAS-based arithmetic (
fetch_add,fetch_sub, etc.): UseAcqRelon success andAcquireon failure within the CAS loop. The loop ensures eventual consistency.
§Implementation Details
Since hardware doesn’t provide native atomic floating-point operations,
this type is implemented using AtomicU64 with f64::to_bits() and
f64::from_bits() conversions. This preserves bit patterns exactly,
including special values like NaN and infinity.
§Features
- Automatic memory ordering selection
- Arithmetic operations via CAS loops
- Zero-cost abstraction with inline methods
- Access to underlying type via
inner()for advanced use cases
§Limitations
- Arithmetic operations use CAS loops (slower than integer operations)
- NaN values may cause unexpected behavior in CAS operations
- No max/min operations (complex floating point semantics)
§Example
use prism3_rust_concurrent::atomic::AtomicF64;
let atomic = AtomicF64::new(3.14159);
atomic.add(1.0);
assert_eq!(atomic.load(), 4.14159);§Author
Haixing Hu
Implementations§
Source§impl AtomicF64
impl AtomicF64
Sourcepub fn compare_set(&self, current: f64, new: f64) -> Result<(), f64>
pub fn compare_set(&self, current: f64, new: f64) -> Result<(), f64>
Compares and sets the value atomically.
If the current value equals current, sets it to new and returns
Ok(()). Otherwise, returns Err(actual) where actual is the
current value.
§Memory Ordering
- Success: Uses
AcqRelordering on the underlyingAtomicU64to ensure full synchronization when the exchange succeeds. - Failure: Uses
Acquireordering to observe the actual value written by another thread.
§Parameters
current- The expected current value.new- The new value to set if current matches.
§Returns
Ok(()) on success, or Err(actual) on failure.
Sourcepub fn compare_set_weak(&self, current: f64, new: f64) -> Result<(), f64>
pub fn compare_set_weak(&self, current: f64, new: f64) -> Result<(), f64>
Weak version of compare-and-set.
May spuriously fail even when the comparison succeeds. Should be used in a loop.
Uses AcqRel ordering on success and Acquire ordering on failure.
§Parameters
current- The expected current value.new- The new value to set if current matches.
§Returns
Ok(()) on success, or Err(actual) on failure.
Sourcepub fn compare_and_exchange(&self, current: f64, new: f64) -> f64
pub fn compare_and_exchange(&self, current: f64, new: f64) -> f64
Compares and exchanges the value atomically, returning the previous value.
If the current value equals current, sets it to new and returns
the old value. Otherwise, returns the actual current value.
Uses AcqRel ordering on success and Acquire ordering on failure.
§Parameters
current- The expected current value.new- The new value to set if current matches.
§Returns
The value before the operation.
Sourcepub fn compare_and_exchange_weak(&self, current: f64, new: f64) -> f64
pub fn compare_and_exchange_weak(&self, current: f64, new: f64) -> f64
Weak version of compare-and-exchange.
May spuriously fail even when the comparison succeeds. Should be used in a loop.
Uses AcqRel ordering on success and Acquire ordering on failure.
§Parameters
current- The expected current value.new- The new value to set if current matches.
§Returns
The value before the operation.
Sourcepub fn fetch_add(&self, delta: f64) -> f64
pub fn fetch_add(&self, delta: f64) -> f64
Atomically adds a value, returning the old value.
§Memory Ordering
Internally uses a CAS loop with compare_set_weak, which uses
AcqRel on success and Acquire on failure. The loop ensures
eventual consistency even under high contention.
§Performance
May be slow in high-contention scenarios due to the CAS loop. Consider using atomic integers if performance is critical.
§Parameters
delta- The value to add.
§Returns
The old value before adding.
§Example
use prism3_rust_concurrent::atomic::AtomicF64;
let atomic = AtomicF64::new(10.0);
let old = atomic.fetch_add(5.5);
assert_eq!(old, 10.0);
assert_eq!(atomic.load(), 15.5);Sourcepub fn fetch_sub(&self, delta: f64) -> f64
pub fn fetch_sub(&self, delta: f64) -> f64
Atomically subtracts a value, returning the old value.
§Memory Ordering
Internally uses a CAS loop with compare_set_weak, which uses
AcqRel on success and Acquire on failure. The loop ensures
eventual consistency even under high contention.
§Parameters
delta- The value to subtract.
§Returns
The old value before subtracting.
§Example
use prism3_rust_concurrent::atomic::AtomicF64;
let atomic = AtomicF64::new(10.0);
let old = atomic.fetch_sub(3.5);
assert_eq!(old, 10.0);
assert_eq!(atomic.load(), 6.5);Sourcepub fn fetch_mul(&self, factor: f64) -> f64
pub fn fetch_mul(&self, factor: f64) -> f64
Atomically multiplies by a factor, returning the old value.
§Memory Ordering
Internally uses a CAS loop with compare_set_weak, which uses
AcqRel on success and Acquire on failure. The loop ensures
eventual consistency even under high contention.
§Parameters
factor- The factor to multiply by.
§Returns
The old value before multiplying.
§Example
use prism3_rust_concurrent::atomic::AtomicF64;
let atomic = AtomicF64::new(10.0);
let old = atomic.fetch_mul(2.5);
assert_eq!(old, 10.0);
assert_eq!(atomic.load(), 25.0);Sourcepub fn fetch_div(&self, divisor: f64) -> f64
pub fn fetch_div(&self, divisor: f64) -> f64
Atomically divides by a divisor, returning the old value.
§Memory Ordering
Internally uses a CAS loop with compare_set_weak, which uses
AcqRel on success and Acquire on failure. The loop ensures
eventual consistency even under high contention.
§Parameters
divisor- The divisor to divide by.
§Returns
The old value before dividing.
§Example
use prism3_rust_concurrent::atomic::AtomicF64;
let atomic = AtomicF64::new(10.0);
let old = atomic.fetch_div(2.0);
assert_eq!(old, 10.0);
assert_eq!(atomic.load(), 5.0);Sourcepub fn fetch_update<F>(&self, f: F) -> f64
pub fn fetch_update<F>(&self, f: F) -> f64
Updates the value using a function, returning the old value.
§Memory Ordering
Internally uses a CAS loop with compare_set_weak, which uses
AcqRel on success and Acquire on failure. The loop ensures
eventual consistency even under high contention.
§Parameters
f- A function that takes the current value and returns the new value.
§Returns
The old value before the update.
Sourcepub fn inner(&self) -> &AtomicU64
pub fn inner(&self) -> &AtomicU64
Gets a reference to the underlying standard library atomic type.
This allows direct access to the standard library’s atomic operations for advanced use cases that require fine-grained control over memory ordering.
§Memory Ordering
When using the returned reference, you have full control over memory
ordering. Remember to use f64::to_bits() and f64::from_bits() for
conversions.
§Returns
A reference to the underlying std::sync::atomic::AtomicU64.