Trait concordium_std::marker::Sync1.0.0[][src]

pub unsafe auto trait Sync { }
Expand description

Types for which it is safe to share references between threads.

This trait is automatically implemented when the compiler determines it’s appropriate.

The precise definition is: a type T is Sync if and only if &T is Send. In other words, if there is no possibility of undefined behavior (including data races) when passing &T references between threads.

As one would expect, primitive types like u8 and f64 are all Sync, and so are simple aggregate types containing them, like tuples, structs and enums. More examples of basic Sync types include “immutable” types like &T, and those with simple inherited mutability, such as Box<T>, Vec<T> and most other collection types. (Generic parameters need to be Sync for their container to be Sync.)

A somewhat surprising consequence of the definition is that &mut T is Sync (if T is Sync) even though it seems like that might provide unsynchronized mutation. The trick is that a mutable reference behind a shared reference (that is, & &mut T) becomes read-only, as if it were a & &T. Hence there is no risk of a data race.

Types that are not Sync are those that have “interior mutability” in a non-thread-safe form, such as Cell and RefCell. These types allow for mutation of their contents even through an immutable, shared reference. For example the set method on Cell<T> takes &self, so it requires only a shared reference &Cell<T>. The method performs no synchronization, thus Cell cannot be Sync.

Another example of a non-Sync type is the reference-counting pointer Rc. Given any reference &Rc<T>, you can clone a new Rc<T>, modifying the reference counts in a non-atomic way.

For cases when one does need thread-safe interior mutability, Rust provides atomic data types, as well as explicit locking via sync::Mutex and sync::RwLock. These types ensure that any mutation cannot cause data races, hence the types are Sync. Likewise, sync::Arc provides a thread-safe analogue of Rc.

Any types with interior mutability must also use the cell::UnsafeCell wrapper around the value(s) which can be mutated through a shared reference. Failing to doing this is undefined behavior. For example, transmute-ing from &T to &mut T is invalid.

See the Nomicon for more details about Sync.

Implementations on Foreign Types

impl Sync for Once[src]

impl<T> !Sync for Receiver<T>[src]

impl<T> Sync for JoinHandle<T>[src]

impl<'_, T> Sync for MutexGuard<'_, T> where
    T: Sync + ?Sized
[src]

impl<T> Sync for SyncOnceCell<T> where
    T: Sync + Send
[src]

impl<'_, T> Sync for RwLockWriteGuard<'_, T> where
    T: Sync + ?Sized
[src]

impl !Sync for ArgsOs[src]

impl<'_, T> Sync for RwLockReadGuard<'_, T> where
    T: Sync + ?Sized
[src]

impl<T> Sync for Key<T>[src]

impl<T, F> Sync for SyncLazy<T, F> where
    F: Send,
    SyncOnceCell<T>: Sync
[src]

impl<T> !Sync for Sender<T>[src]

impl<'a> Sync for IoSliceMut<'a>[src]

impl<T> Sync for RwLock<T> where
    T: Send + Sync + ?Sized
[src]

impl<'a> Sync for IoSlice<'a>[src]

impl !Sync for Args[src]

impl<T> Sync for Mutex<T> where
    T: Send + ?Sized
[src]

impl<T> !Sync for UnsafeCell<T> where
    T: ?Sized
[src]

impl<Dyn> Sync for DynMetadata<Dyn> where
    Dyn: ?Sized
[src]

impl Sync for AtomicUsize[src]

impl<'_, T> Sync for Iter<'_, T> where
    T: Sync
[src]

impl Sync for AtomicU64[src]

impl Sync for AtomicIsize[src]

impl<T> !Sync for *const T where
    T: ?Sized
[src]

impl Sync for AtomicI32[src]

impl<T> !Sync for *mut T where
    T: ?Sized
[src]

impl Sync for AtomicU8[src]

impl<T> Sync for Empty<T>[src]

impl Sync for AtomicBool[src]

impl Sync for AtomicI16[src]

impl Sync for AtomicI8[src]

impl Sync for Waker[src]

impl<T> !Sync for RefCell<T> where
    T: ?Sized
[src]

impl<T> Sync for AtomicPtr<T>[src]

impl Sync for AtomicI64[src]

impl Sync for AtomicU16[src]

impl<T> !Sync for Cell<T> where
    T: ?Sized
[src]

impl<'_, T> Sync for IterMut<'_, T> where
    T: Sync
[src]

impl Sync for AtomicU32[src]

impl<T> !Sync for NonNull<T> where
    T: ?Sized
[src]

NonNull pointers are not Sync because the data they reference may be aliased.

impl<'_> Sync for Drain<'_>[src]

impl<T> Sync for Weak<T> where
    T: Sync + Send + ?Sized
[src]

impl<T> !Sync for Rc<T> where
    T: ?Sized
[src]

impl<T, A> Sync for IntoIter<T, A> where
    T: Sync,
    A: Allocator
[src]

impl<'_, T, A> Sync for Drain<'_, T, A> where
    T: Sync,
    A: Sync + Allocator
[src]

impl<T> !Sync for Weak<T> where
    T: ?Sized
[src]

impl<T> Sync for Arc<T> where
    T: Sync + Send + ?Sized
[src]

impl<'a> Sync for WeeAlloc<'a>[src]

impl Sync for isize

impl<T> Sync for [T] where
    T: Sync

impl Sync for [u8]

impl Sync for char

impl Sync for u128

impl Sync for u16

impl Sync for i128

impl Sync for i16

impl Sync for str

impl Sync for f64

impl Sync for u64

impl Sync for u8

impl Sync for i64

impl Sync for i8

impl<T, const N: usize> Sync for [T; N] where
    T: Sync

impl Sync for bool

impl Sync for f32

impl Sync for u32

impl Sync for usize

impl Sync for i32

Loading content...

Implementors

impl<'_, T> Sync for concordium_std::collections::linked_list::Cursor<'_, T> where
    T: Sync
[src]

impl<'_, T> Sync for CursorMut<'_, T> where
    T: Sync
[src]

impl<'_, T> Sync for concordium_std::collections::linked_list::Iter<'_, T> where
    T: Sync
[src]

impl<'_, T> Sync for concordium_std::collections::linked_list::IterMut<'_, T> where
    T: Sync
[src]

impl<'_, T> Sync for concordium_std::collections::vec_deque::Drain<'_, T> where
    T: Sync
1.6.0[src]

impl<'_, T> Sync for concordium_std::collections::vec_deque::IterMut<'_, T> where
    T: Sync
[src]

impl<T> Sync for LinkedList<T> where
    T: Sync
[src]

Loading content...

Auto implementors

impl Sync for TryReserveError

impl Sync for Infallible

impl Sync for Address

impl Sync for AmountParseError

impl Sync for LogError

impl Sync for NewContractNameError

impl Sync for NewReceiveNameError

impl Sync for ParseDurationError

impl Sync for SeekFrom

impl Sync for FpCategory

impl Sync for IntErrorKind

impl Sync for Fields

impl Sync for SizeLength

impl Sync for Type

impl Sync for ActionsTree

impl Sync for ContractStateError

impl Sync for DefaultHasher

impl Sync for RandomState

impl Sync for NonZeroI8

impl Sync for NonZeroI16

impl Sync for NonZeroI32

impl Sync for NonZeroI64

impl Sync for NonZeroI128

impl Sync for NonZeroIsize

impl Sync for NonZeroU8

impl Sync for NonZeroU16

impl Sync for NonZeroU32

impl Sync for NonZeroU64

impl Sync for NonZeroU128

impl Sync for NonZeroUsize

impl Sync for ParseFloatError

impl Sync for ParseIntError

impl Sync for TryFromIntError

impl Sync for Contract

impl Sync for Module

impl Sync for AccountAddress

impl Sync for Action

impl Sync for Amount

impl Sync for AttributeTag

impl Sync for AttributesCursor

impl Sync for ChainMetadata

impl Sync for ContractAddress

impl Sync for ContractState

impl Sync for Duration

impl Sync for Logger

impl Sync for OwnedContractName

impl Sync for OwnedReceiveName

impl Sync for Parameter

impl Sync for ParseError

impl Sync for PoliciesIterator

impl Sync for Reject

impl Sync for String

impl Sync for Timestamp

impl Sync for ChainMetaTest

impl Sync for LogRecorder

impl Sync for TestPolicy

impl Sync for PhantomPinned

impl<'a> Sync for ContractName<'a>

impl<'a> Sync for ReceiveName<'a>

impl<'a, C> Sync for ContextTest<'a, C> where
    C: Sync

impl<'a, K> Sync for concordium_std::collections::hash_set::Drain<'a, K> where
    K: Sync

impl<'a, K> Sync for concordium_std::collections::hash_set::Iter<'a, K> where
    K: Sync

impl<'a, K, F> Sync for concordium_std::collections::hash_set::DrainFilter<'a, K, F> where
    F: Sync,
    K: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::Entry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::Entry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::Iter<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::IterMut<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::Keys<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::OccupiedEntry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::OccupiedError<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::Range<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for RangeMut<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::VacantEntry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::Values<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::btree_map::ValuesMut<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::Drain<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::Iter<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::IterMut<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::Keys<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::OccupiedEntry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::OccupiedError<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::VacantEntry<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::Values<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V> Sync for concordium_std::collections::hash_map::ValuesMut<'a, K, V> where
    K: Sync,
    V: Sync

impl<'a, K, V, F> Sync for concordium_std::collections::btree_map::DrainFilter<'a, K, V, F> where
    F: Sync,
    K: Sync,
    V: Sync

impl<'a, K, V, F> Sync for concordium_std::collections::hash_map::DrainFilter<'a, K, V, F> where
    F: Sync,
    K: Sync,
    V: Sync

impl<'a, K, V, S> Sync for RawEntryMut<'a, K, V, S> where
    K: Sync,
    S: Sync,
    V: Sync

impl<'a, K, V, S> Sync for RawEntryBuilder<'a, K, V, S> where
    K: Sync,
    S: Sync,
    V: Sync

impl<'a, K, V, S> Sync for RawEntryBuilderMut<'a, K, V, S> where
    K: Sync,
    S: Sync,
    V: Sync

impl<'a, K, V, S> Sync for RawOccupiedEntryMut<'a, K, V, S> where
    K: Sync,
    V: Sync

impl<'a, K, V, S> Sync for RawVacantEntryMut<'a, K, V, S> where
    K: Sync,
    S: Sync,
    V: Sync

impl<'a, T> Sync for concordium_std::collections::binary_heap::Drain<'a, T> where
    T: Sync

impl<'a, T> Sync for DrainSorted<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::binary_heap::Iter<'a, T> where
    T: Sync

impl<'a, T> Sync for PeekMut<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::Difference<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::Intersection<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::Iter<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::Range<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::SymmetricDifference<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::btree_set::Union<'a, T> where
    T: Sync

impl<'a, T> Sync for concordium_std::collections::vec_deque::Iter<'a, T> where
    T: Sync

impl<'a, T, F> !Sync for concordium_std::collections::linked_list::DrainFilter<'a, T, F>

impl<'a, T, F> Sync for concordium_std::collections::btree_set::DrainFilter<'a, T, F> where
    F: Sync,
    T: Sync

impl<'a, T, S> Sync for concordium_std::collections::hash_set::Difference<'a, T, S> where
    S: Sync,
    T: Sync

impl<'a, T, S> Sync for concordium_std::collections::hash_set::Intersection<'a, T, S> where
    S: Sync,
    T: Sync

impl<'a, T, S> Sync for concordium_std::collections::hash_set::SymmetricDifference<'a, T, S> where
    S: Sync,
    T: Sync

impl<'a, T, S> Sync for concordium_std::collections::hash_set::Union<'a, T, S> where
    S: Sync,
    T: Sync

impl<Attributes> Sync for Policy<Attributes> where
    Attributes: Sync

impl<K> Sync for concordium_std::collections::hash_set::IntoIter<K> where
    K: Sync

impl<K, V> Sync for concordium_std::collections::btree_map::IntoIter<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for concordium_std::collections::btree_map::IntoKeys<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for concordium_std::collections::btree_map::IntoValues<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for concordium_std::collections::hash_map::IntoIter<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for concordium_std::collections::hash_map::IntoKeys<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for concordium_std::collections::hash_map::IntoValues<K, V> where
    K: Sync,
    V: Sync

impl<K, V> Sync for BTreeMap<K, V> where
    K: Sync,
    V: Sync

impl<K, V, S> Sync for HashMap<K, V, S> where
    K: Sync,
    S: Sync,
    V: Sync

impl<T> Sync for Bound<T> where
    T: Sync

impl<T> Sync for concordium_std::collections::binary_heap::IntoIter<T> where
    T: Sync

impl<T> Sync for IntoIterSorted<T> where
    T: Sync

impl<T> Sync for concordium_std::collections::btree_set::IntoIter<T> where
    T: Sync

impl<T> Sync for concordium_std::collections::linked_list::IntoIter<T> where
    T: Sync

impl<T> Sync for BTreeSet<T> where
    T: Sync

impl<T> Sync for BinaryHeap<T> where
    T: Sync

impl<T> Sync for VecDeque<T> where
    T: Sync

impl<T> Sync for concordium_std::collections::vec_deque::IntoIter<T> where
    T: Sync

impl<T> Sync for Discriminant<T>

impl<T> Sync for Wrapping<T> where
    T: Sync

impl<T> Sync for concordium_std::Cursor<T> where
    T: Sync

impl<T> Sync for ContractStateTest<T> where
    T: Sync

impl<T> Sync for MaybeUninit<T> where
    T: Sync

impl<T, A> Sync for Vec<T, A> where
    A: Sync,
    T: Sync

impl<T, S> Sync for HashSet<T, S> where
    S: Sync,
    T: Sync

impl<T: ?Sized> Sync for ManuallyDrop<T> where
    T: Sync

impl<T: ?Sized> Sync for PhantomData<T> where
    T: Sync

Loading content...