Expand description
Atomic types
Atomic types provide primitive shared-memory communication between threads, and are the building blocks of other concurrent types.
This module defines atomic versions of a select number of primitive types, the same as
std::sync::atomic
in the standard library. See that module’s documentation for more details.
§Warning about relaxed behaviors
Shuttle does not faithfully model behaviors of relaxed atomic orderings (those other than
SeqCst
). Code that uses these orderings may contain bugs that Shuttle is
unable to find if the bug requires the relaxed behavior to occur. Shuttle models all atomic
operations as if they were using SeqCst ordering.
For example, consider this test that uses a flag
variable to indicate that data is present in
a separate data
variable:
let flag = Arc::new(AtomicBool::new(false));
let data = Arc::new(AtomicU64::new(0));
{
let flag = Arc::clone(&flag);
let data = Arc::clone(&data);
thread::spawn(move|| {
data.store(42, Ordering::Relaxed);
flag.store(true, Ordering::Relaxed);
});
}
if flag.load(Ordering::Relaxed) {
assert_eq!(data.load(Ordering::Relaxed), 42);
}
This code is incorrect because of the relaxed orderings used for the loads and stores. Some
architectures will allow an execution where flag
is true but the assertion is false. However,
Shuttle treats all atomic operations as SeqCst, and this test would be correct if we used SeqCst
for all atomic operations, so Shuttle cannot find this bug.
If you are writing code that relies on relaxed atomic operations and need to check its correctness, the Loom crate provides support for reasoning about Acquire and Release orderings and partial support for Relaxed orderings.
To disable the warning printed about this issue, set the SHUTTLE_SILENCE_WARNINGS
environment
variable to any value, or set the silence_warnings
field of
Config
to true.
Structs§
- A boolean type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- A raw pointer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
- An integer type which can be safely shared between threads.
Enums§
- Atomic memory orderings
Functions§
- A compiler memory fence.
- An atomic fence, like the standard library’s std::sync::atomic::fence.