Trait frame_support::dispatch::marker::Sync 1.0.0[−][src]
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 Argument
[src]
impl Sync for FormatSpec
[src]
impl Sync for Alignment
[src]
impl Sync for Count
[src]
impl<'_, T> Sync for RwLockWriteGuard<'_, T> where
T: Sync + ?Sized,
[src]
T: Sync + ?Sized,
impl Sync for Once
[src]
impl<'a> Sync for IoSliceMut<'a>
[src]
impl<T> Sync for RwLock<T> where
T: Send + Sync + ?Sized,
[src]
T: Send + Sync + ?Sized,
impl<T> Sync for SyncOnceCell<T> where
T: Send + Sync,
[src]
T: Send + Sync,
impl<T> !Sync for Sender<T>
[src]
impl<'_, T> Sync for MutexGuard<'_, T> where
T: Sync + ?Sized,
[src]
T: Sync + ?Sized,
impl !Sync for Args
[src]
impl<T, F> Sync for SyncLazy<T, F> where
F: Send,
SyncOnceCell<T>: Sync,
[src]
F: Send,
SyncOnceCell<T>: Sync,
impl<'a> Sync for IoSlice<'a>
[src]
impl<T> Sync for Mutex<T> where
T: Send + ?Sized,
[src]
T: Send + ?Sized,
impl<T> Sync for Key<T>
[src]
impl !Sync for ArgsOs
[src]
impl<'_, T> Sync for RwLockReadGuard<'_, T> where
T: Sync + ?Sized,
[src]
T: Sync + ?Sized,
impl<T> !Sync for Receiver<T>
[src]
impl<T> Sync for JoinHandle<T>
[src]
impl Sync for Waker
[src]
impl Sync for AtomicI16
[src]
impl Sync for AtomicI32
[src]
impl<T> !Sync for UnsafeCell<T> where
T: ?Sized,
[src]
T: ?Sized,
impl<'_, T> Sync for Iter<'_, T> where
T: Sync,
[src]
T: Sync,
impl Sync for AtomicBool
[src]
impl Sync for AtomicU8
[src]
impl Sync for AtomicU32
[src]
impl Sync for AtomicI64
[src]
impl<T> Sync for Empty<T>
[src]
impl<T> Sync for AtomicPtr<T>
[src]
impl<T> !Sync for *const T where
T: ?Sized,
[src]
T: ?Sized,
impl Sync for AtomicUsize
[src]
impl<T> !Sync for Cell<T> where
T: ?Sized,
[src]
T: ?Sized,
impl<'_, T> Sync for IterMut<'_, T> where
T: Sync,
[src]
T: Sync,
impl<T> !Sync for NonNull<T> where
T: ?Sized,
[src]
T: ?Sized,
NonNull
pointers are not Sync
because the data they reference may be aliased.
impl<T> !Sync for RefCell<T> where
T: ?Sized,
[src]
T: ?Sized,
impl Sync for AtomicU64
[src]
impl Sync for AtomicIsize
[src]
impl<T> !Sync for *mut T where
T: ?Sized,
[src]
T: ?Sized,
impl Sync for AtomicU16
[src]
impl Sync for AtomicI8
[src]
impl<'_, T> Sync for CursorMut<'_, T> where
T: Sync,
[src]
T: Sync,
impl<T> Sync for Weak<T> where
T: Send + Sync + ?Sized,
[src]
T: Send + Sync + ?Sized,
impl<T> !Sync for Rc<T> where
T: ?Sized,
[src]
T: ?Sized,
impl<T> !Sync for Weak<T> where
T: ?Sized,
[src]
T: ?Sized,
impl<'_, T> Sync for IterMut<'_, T> where
T: Sync,
[src]
T: Sync,
impl<'_, T> Sync for Iter<'_, T> where
T: Sync,
[src]
T: Sync,
impl<'_, T> Sync for IterMut<'_, T> where
T: Sync,
[src]
T: Sync,
impl<'_, T, A> Sync for Drain<'_, T, A> where
T: Sync,
A: Sync + Allocator,
[src]
T: Sync,
A: Sync + Allocator,
impl<T> Sync for LinkedList<T> where
T: Sync,
[src]
T: Sync,
impl<'_> Sync for Drain<'_>
[src]
impl<T, A> Sync for IntoIter<T, A> where
T: Sync,
A: Allocator,
[src]
T: Sync,
A: Allocator,
impl<T> Sync for Arc<T> where
T: Send + Sync + ?Sized,
[src]
T: Send + Sync + ?Sized,
impl<'_, T> Sync for Cursor<'_, T> where
T: Sync,
[src]
T: Sync,
impl<'_, T> Sync for Drain<'_, T> where
T: Sync,
[src]
T: Sync,
impl<'a, A> Sync for Drain<'a, A> where
A: Array + Sync,
[src]
A: Array + Sync,
impl<T> Sync for ThreadLocal<T> where
T: Send,
T: Send,
impl<T, F> Sync for Lazy<T, F> where
F: Send,
OnceCell<T>: Sync,
[src]
F: Send,
OnceCell<T>: Sync,
impl<'a, R, T> Sync for MappedRwLockReadGuard<'a, R, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawRwLock,
T: 'a + Sync + ?Sized,
R: 'a + RawRwLock,
impl<'a, R, T> Sync for MutexGuard<'a, R, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
impl<'a, R, T> Sync for MappedMutexGuard<'a, R, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
impl<'a, R, G, T> Sync for ReentrantMutexGuard<'a, R, G, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
G: 'a + GetThreadId + Sync,
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
G: 'a + GetThreadId + Sync,
impl<'a, R, T> Sync for MappedRwLockWriteGuard<'a, R, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawRwLock,
T: 'a + Sync + ?Sized,
R: 'a + RawRwLock,
impl<R, T> Sync for Mutex<R, T> where
T: Send + ?Sized,
R: RawMutex + Sync,
T: Send + ?Sized,
R: RawMutex + Sync,
impl<R, G> Sync for RawReentrantMutex<R, G> where
R: RawMutex + Sync,
G: GetThreadId + Sync,
R: RawMutex + Sync,
G: GetThreadId + Sync,
impl<R, T> Sync for RwLock<R, T> where
T: Send + Sync + ?Sized,
R: RawRwLock + Sync,
T: Send + Sync + ?Sized,
R: RawRwLock + Sync,
impl Sync for GuardNoSend
impl<'a, R, G, T> Sync for MappedReentrantMutexGuard<'a, R, G, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
G: 'a + GetThreadId + Sync,
T: 'a + Sync + ?Sized,
R: 'a + RawMutex + Sync,
G: 'a + GetThreadId + Sync,
impl<R, G, T> Sync for ReentrantMutex<R, G, T> where
T: Send + ?Sized,
R: RawMutex + Sync,
G: GetThreadId + Sync,
T: Send + ?Sized,
R: RawMutex + Sync,
G: GetThreadId + Sync,
impl<'a, R, T> Sync for RwLockUpgradableReadGuard<'a, R, T> where
T: 'a + Sync + ?Sized,
R: 'a + RawRwLockUpgrade,
T: 'a + Sync + ?Sized,
R: 'a + RawRwLockUpgrade,
impl<T, F, S> Sync for ScopeGuard<T, F, S> where
T: Sync,
F: FnOnce(T),
S: Strategy,
[src]
T: Sync,
F: FnOnce(T),
S: Strategy,
impl<'a, T> Sync for Drain<'a, T> where
T: Array + Sync,
[src]
T: Array + Sync,
impl<T, C> Sync for OwnedRefMut<T, C> where
C: Config,
T: Sync + Clear + Default,
[src]
C: Config,
T: Sync + Clear + Default,
impl<T, C> Sync for Pool<T, C> where
C: Config,
T: Sync + Clear + Default,
[src]
C: Config,
T: Sync + Clear + Default,
impl<T, C> Sync for Slab<T, C> where
C: Config,
T: Sync,
[src]
C: Config,
T: Sync,
impl<T, C> Sync for OwnedRef<T, C> where
C: Config,
T: Sync + Clear + Default,
[src]
C: Config,
T: Sync + Clear + Default,
impl<T, C> Sync for OwnedEntry<T, C> where
C: Config,
T: Sync,
[src]
C: Config,
T: Sync,
impl<'a, A> Sync for Drain<'a, A> where
A: Array + Sync,
[src]
A: Array + Sync,
impl<T, N> Sync for GenericArray<T, N> where
T: Sync,
N: ArrayLength<T>,
T: Sync,
N: ArrayLength<T>,
impl<T, N> Sync for GenericArray<T, N> where
T: Sync,
N: ArrayLength<T>,
T: Sync,
N: ArrayLength<T>,
impl<'_, K, V, S> Sync for RawOccupiedEntryMut<'_, K, V, S> where
K: Sync,
V: Sync,
S: Sync,
K: Sync,
V: Sync,
S: Sync,
impl<'_, K, V, S> Sync for OccupiedEntry<'_, K, V, S> where
K: Sync,
V: Sync,
S: Sync,
K: Sync,
V: Sync,
S: Sync,
impl Sync for AtomicWaker
impl<T> Sync for Mutex<T> where
T: Send + ?Sized,
T: Send + ?Sized,
impl<'_, T, U> Sync for MappedMutexGuard<'_, T, U> where
T: Sync + ?Sized,
U: Sync + ?Sized,
T: Sync + ?Sized,
U: Sync + ?Sized,
impl<'_, T> Sync for MutexGuard<'_, T> where
T: Sync + ?Sized,
T: Sync + ?Sized,
impl<'_, T> Sync for MutexLockFuture<'_, T> where
T: ?Sized,
T: ?Sized,
impl<Fut> Sync for FuturesUnordered<Fut> where
Fut: Sync,
Fut: Sync,
impl Sync for isize
[src]
impl<T> Sync for [T] where
T: Sync,
[src]
T: Sync,
impl Sync for [u8]
[src]
impl Sync for char
[src]
impl Sync for u128
[src]
impl Sync for u16
[src]
impl Sync for i128
[src]
impl Sync for i16
[src]
impl Sync for str
[src]
impl Sync for f64
[src]
impl Sync for u64
[src]
impl Sync for u8
[src]
impl Sync for i64
[src]
impl Sync for i8
[src]
impl<T, const N: usize> Sync for [T; N] where
T: Sync,
[src]
T: Sync,
impl Sync for bool
[src]
impl Sync for f32
[src]
impl Sync for u32
[src]
impl Sync for usize
[src]
impl Sync for i32
[src]
Loading content...Implementors
Loading content...Auto implementors
impl Sync for frame_support::dispatch::fmt::Alignment
[src]
impl Sync for Never
[src]
impl Sync for Void
[src]
impl Sync for RuntimeMetadata
[src]
impl Sync for StorageEntryModifier
[src]
impl Sync for StorageEntryType
[src]
impl Sync for StorageHasher
[src]
impl Sync for DispatchError
[src]
impl Sync for InvalidTransaction
[src]
impl Sync for TransactionSource
[src]
impl Sync for TransactionValidityError
[src]
impl Sync for UnknownTransaction
[src]
impl Sync for ChildInfo
[src]
impl Sync for ChildType
[src]
impl Sync for KillOutcome
[src]
impl Sync for BalanceStatus
[src]
impl Sync for ExistenceRequirement
[src]
impl Sync for DispatchClass
[src]
impl Sync for Pays
[src]
impl Sync for FrameTransactionPriority
[src]
impl Sync for RuntimeLogger
[src]
impl Sync for Writer
[src]
impl Sync for Error
[src]
impl Sync for PhantomPinned
[src]
impl Sync for ErrorMetadata
[src]
impl Sync for FunctionArgumentMetadata
[src]
impl Sync for FunctionMetadata
[src]
impl Sync for ModuleConstantMetadata
[src]
impl Sync for EventMetadata
[src]
impl Sync for OuterEventMetadata
[src]
impl Sync for Instance0
[src]
impl Sync for Instance1
[src]
impl Sync for Instance2
[src]
impl Sync for Instance3
[src]
impl Sync for Instance4
[src]
impl Sync for Instance5
[src]
impl Sync for Instance6
[src]
impl Sync for Instance7
[src]
impl Sync for Instance8
[src]
impl Sync for Instance9
[src]
impl Sync for Instance10
[src]
impl Sync for Instance11
[src]
impl Sync for Instance12
[src]
impl Sync for Instance13
[src]
impl Sync for Instance14
[src]
impl Sync for Instance15
[src]
impl Sync for DefaultByteGetter
[src]
impl Sync for ExtrinsicMetadata
[src]
impl Sync for ModuleMetadata
[src]
impl Sync for RuntimeMetadataPrefixed
[src]
impl Sync for StorageEntryMetadata
[src]
impl Sync for StorageMetadata
[src]
impl Sync for Blake2_128
[src]
impl Sync for Blake2_128Concat
[src]
impl Sync for Blake2_256
[src]
impl Sync for Identity
[src]
impl Sync for InherentData
[src]
impl Sync for Twox64Concat
[src]
impl Sync for Twox128
[src]
impl Sync for Twox256
[src]
impl Sync for ValidTransaction
[src]
impl Sync for OptionQuery
[src]
impl Sync for ValueQuery
[src]
impl Sync for CallMetadata
[src]
impl Sync for GetDefault
[src]
impl Sync for PalletVersion
[src]
impl Sync for SaturatingCurrencyToVote
[src]
impl Sync for TestRandomness
[src]
impl Sync for U128CurrencyToVote
[src]
impl Sync for WithdrawReasons
[src]
impl Sync for BlockExecutionWeight
[src]
impl Sync for ExtrinsicBaseWeight
[src]
impl Sync for ParityDbWeight
[src]
impl Sync for RocksDbWeight
[src]
impl Sync for DispatchInfo
[src]
impl Sync for PostDispatchInfo
[src]
impl Sync for RuntimeDbWeight
[src]
impl<'a> !Sync for Arguments<'a>
[src]
impl<'a> !Sync for Formatter<'a>
[src]
impl<'a, 'b> !Sync for DebugList<'a, 'b>
[src]
impl<'a, 'b> !Sync for DebugMap<'a, 'b>
[src]
impl<'a, 'b> !Sync for DebugSet<'a, 'b>
[src]
impl<'a, 'b> !Sync for DebugStruct<'a, 'b>
[src]
impl<'a, 'b> !Sync for DebugTuple<'a, 'b>
[src]
impl<'a, T> Sync for frame_support::dispatch::result::Iter<'a, T> where
T: Sync,
[src]
T: Sync,
impl<'a, T> Sync for frame_support::dispatch::result::IterMut<'a, T> where
T: Sync,
[src]
T: Sync,
impl<B, O> Sync for DecodeDifferent<B, O> where
B: Sync,
O: Sync,
[src]
B: Sync,
O: Sync,
impl<B, P> Sync for SignedImbalance<B, P> where
P: Sync,
<P as Imbalance<B>>::Opposite: Sync,
[src]
P: Sync,
<P as Imbalance<B>>::Opposite: Sync,
impl<Balance> Sync for WeightToFeeCoefficient<Balance> where
Balance: Sync,
[src]
Balance: Sync,
impl<Balance, Imbalance, Part1, Target1, Part2, Target2> Sync for SplitTwoWays<Balance, Imbalance, Part1, Target1, Part2, Target2> where
Balance: Sync,
Imbalance: Sync,
Part1: Sync,
Part2: Sync,
Target1: Sync,
Target2: Sync,
[src]
Balance: Sync,
Imbalance: Sync,
Part1: Sync,
Part2: Sync,
Target1: Sync,
Target2: Sync,
impl<BlockNumber> Sync for DispatchTime<BlockNumber> where
BlockNumber: Sync,
[src]
BlockNumber: Sync,
impl<E> Sync for FnEncode<E>
[src]
impl<F, T> Sync for ClearFilterGuard<F, T> where
T: Sync,
<F as FilterStack<T>>::Stack: Sync,
[src]
T: Sync,
<F as FilterStack<T>>::Stack: Sync,
impl<F, T> Sync for FilterStackGuard<F, T> where
F: Sync,
T: Sync,
[src]
F: Sync,
T: Sync,
impl<K, T, H> Sync for StorageKeyIterator<K, T, H> where
H: Sync,
K: Sync,
T: Sync,
[src]
H: Sync,
K: Sync,
T: Sync,
impl<Prefix, Hasher1, Key1, Hasher2, Key2, Value, QueryKind, OnEmpty> Sync for StorageDoubleMap<Prefix, Hasher1, Key1, Hasher2, Key2, Value, QueryKind, OnEmpty> where
Hasher1: Sync,
Hasher2: Sync,
Key1: Sync,
Key2: Sync,
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
[src]
Hasher1: Sync,
Hasher2: Sync,
Key1: Sync,
Key2: Sync,
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
impl<Prefix, Hasher, Key, Value, QueryKind, OnEmpty> Sync for StorageMap<Prefix, Hasher, Key, Value, QueryKind, OnEmpty> where
Hasher: Sync,
Key: Sync,
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
[src]
Hasher: Sync,
Key: Sync,
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
impl<Prefix, Value, QueryKind, OnEmpty> Sync for StorageValue<Prefix, Value, QueryKind, OnEmpty> where
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
[src]
OnEmpty: Sync,
Prefix: Sync,
QueryKind: Sync,
Value: Sync,
impl<R> Sync for TransactionOutcome<R> where
R: Sync,
[src]
R: Sync,
impl<S, L, K, T> Sync for StorageMapShim<S, L, K, T> where
K: Sync,
L: Sync,
S: Sync,
T: Sync,
[src]
K: Sync,
L: Sync,
S: Sync,
T: Sync,
impl<T> Sync for frame_support::dispatch::result::IntoIter<T> where
T: Sync,
[src]
T: Sync,
impl<T> Sync for StorageIterator<T> where
T: Sync,
[src]
T: Sync,
impl<T> Sync for PrefixIterator<T>
[src]
impl<T> Sync for IdentityFee<T> where
T: Sync,
[src]
T: Sync,
impl<T> Sync for PerDispatchClass<T> where
T: Sync,
[src]
T: Sync,
impl<T, A> Sync for Vec<T, A> where
A: Sync,
T: Sync,
[src]
A: Sync,
T: Sync,
impl<T, E> Sync for Result<T, E> where
E: Sync,
T: Sync,
[src]
E: Sync,
T: Sync,
impl<T: ?Sized> Sync for PhantomData<T> where
T: Sync,
[src]
T: Sync,
impl<WD, CD, PF> Sync for FunctionOf<WD, CD, PF> where
CD: Sync,
PF: Sync,
WD: Sync,
[src]
CD: Sync,
PF: Sync,
WD: Sync,