Trait Sync
unsafe auto trait Sync
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.
A shorter overview of how Sync and Send relate to referencing:
&TisSendif and only ifTisSync&mut TisSendif and only ifTisSend&Tand&mut TareSyncif and only ifTisSync
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.
Implementors
impl<'a, 'b> Sync for DebugSet<'a, 'b>impl Sync for RawWakerimpl Sync for int32x4x2_timpl Sync for vector_bool_intimpl<'a> Sync for PhantomContravariantLifetime<'a>impl<T: ?Sized + Sync> Sync for UnsafePinned<T>impl<Dyn: PointeeSized> Sync for DynMetadata<Dyn>impl<A, B> Sync for Chain<A, B>impl Sync for Errorimpl Sync for AllocErrorimpl Sync for uint32x4x2_timpl Sync for f16x2impl<T> Sync for ChunksMut<'_, T>impl<I, F> Sync for FilterMap<I, F>impl Sync for DynTraitPredicateimpl<H> Sync for BuildHasherDefault<H>impl Sync for uint16x4_timpl Sync for float16x8x2_timpl Sync for m128dimpl<I, G> Sync for IntersperseWith<I, G>impl<'a, T, P> Sync for RSplit<'a, T, P>impl Sync for uint64x1_timpl Sync for float32x4x2_timpl Sync for vector_bool_shortimpl<I, St, F> Sync for Scan<I, St, F>impl<'a, T> Sync for Windows<'a, T>impl Sync for uint16x8_timpl Sync for int64x2x2_timpl Sync for vector_bool_long_longimpl<A, B> Sync for Zip<A, B>impl Sync for Traitimpl<'a, T, P> Sync for ChunkBy<'a, T, P>impl Sync for uint64x2_timpl Sync for uint64x2x2_timpl Sync for Floatimpl Sync for HvxVectorimpl Sync for UnwindActionArgimpl Sync for IntErrorKindimpl<B, C> Sync for ControlFlow<B, C>impl<A> Sync for Repeat<A>impl<'a> Sync for CharIndices<'a>impl Sync for int8x8x4_timpl Sync for Constimpl Sync for poly64x2x2_timpl Sync for neverimpl<T: PointeeSized> Sync for NonNull<T>impl<T> Sync for ManuallyDrop<T>impl Sync for Assumeimpl<Idx> Sync for RangeInclusive<Idx>impl Sync for Ipv6Addrimpl<'a, P> Sync for SplitN<'a, P>impl Sync for uint8x8x4_timpl Sync for __m128dimpl<T, N: usize> Sync for [Option<T>; N]impl Sync for TryFromSliceErrorimpl<T> Sync for Option<T>impl<'a> Sync for Lines<'a>impl<T: ?Sized, VARIANT: u32, FIELD: u32> Sync for FieldRepresentingType<T, VARIANT, FIELD>impl Sync for poly8x8x4_timpl Sync for __m512dimpl Sync for f64impl Sync for Infallibleimpl Sync for BorrowErrorimpl Sync for objc_selectorimpl<'a> Sync for EscapeDebug<'a>impl Sync for int16x4x4_timpl Sync for __m512himpl Sync for i128impl<I> Sync for DecodeUtf16<I>impl<A> Sync for RangeInclusiveIter<A>impl<'a, N: usize> Sync for CharArraySearcher<'a, N>impl Sync for uint16x4x4_timpl Sync for float64x1x4_timpl Sync for isizeimpl Sync for Alignmentimpl Sync for ToTitlecaseimpl<T, E> Sync for Result<T, E>impl<'a> Sync for Utf8Chunks<'a>impl Sync for poly16x4x4_timpl Sync for vector_unsigned_charimpl<T> Sync for OnceCell<T>impl Sync for FromBytesUntilNulErrorimpl<'a, 'b> Sync for DebugTuple<'a, 'b>impl<T> Sync for Poll<T>impl Sync for int32x2x4_timpl Sync for vector_unsigned_intimpl Sync for Location<'_>impl Sync for ParseIntErrorimpl<'a, I> Sync for ByRefSized<'a, I>impl Sync for Alignmentimpl Sync for LayoutErrorimpl Sync for uint32x2x4_timpl Sync for vector_doubleimpl<T: Sync> Sync for IterMut<'_, T>impl Sync for TryFromIntErrorimpl<I, P> Sync for Filter<I, P>impl Sync for SipHasherimpl Sync for int16x4_timpl Sync for float16x4x4_timpl Sync for m128impl Sync for LocalWakerimpl<I> Sync for Intersperse<I>impl<'a, T, P> Sync for SplitInclusiveMut<'a, T, P>impl Sync for int64x1_timpl Sync for float32x2x4_timpl Sync for vector_unsigned_shortimpl<T> Sync for Saturating<T>impl<T> Sync for Rev<T>impl<'a, T, P> Sync for RSplitNMut<'a, T, P>impl Sync for int16x8_timpl Sync for int64x1x4_timpl Sync for vector_unsigned_long_longimpl<I, P> Sync for TakeWhile<I, P>impl<'a, T> Sync for RChunksExact<'a, T>impl Sync for int64x2_timpl Sync for uint64x1x4_timpl Sync for HvxVectorPredimpl<T> Sync for MaybeUninit<T>impl Sync for PhantomPinnedimpl<F> Sync for OnceWith<F>impl<'a> Sync for Chars<'a>impl Sync for int8x8x3_timpl Sync for poly64x1x4_timpl Sync for boolimpl<Idx> Sync for RangeTo<Idx>impl Sync for Ipv4Addrimpl<'a, P> Sync for RSplitTerminator<'a, P>impl Sync for uint8x8x3_timpl Sync for __m128impl<T, N: usize> Sync for [T; N]impl<T, N: usize> Sync for IntoIter<T, N>impl Sync for SocketAddrV6impl<'a, P> Sync for RMatches<'a, P>impl Sync for poly8x8x3_timpl Sync for __m512impl<'a> Sync for PhantomCovariantLifetime<'a>impl Sync for f32impl<T, F = fn() -> T> Sync for LazyCell<T, F>impl Sync for objc_classimpl<'a> Sync for EncodeUtf16<'a>impl Sync for int16x4x3_timpl Sync for __m256himpl Sync for i64impl Sync for CharTryFromErrorimpl<A> Sync for RangeIter<A>impl<'a> Sync for CharSearcher<'a>impl Sync for Genericimpl Sync for uint16x4x3_timpl Sync for float64x1x3_timpl Sync for u128impl Sync for ToUppercaseimpl<Idx> Sync for RangeToInclusive<Idx>impl<'a> Sync for Utf8Chunk<'a>impl Sync for poly16x4x3_timpl Sync for vector_signed_charimpl Sync for TypeIdimpl Sync for FromBytesWithNulErrorimpl<'a, 'b> Sync for DebugStruct<'a, 'b>impl<T> Sync for Ready<T>impl Sync for int32x2x3_timpl Sync for vector_signed_intimpl Sync for Bytes<'_>impl<I, N: usize> Sync for ArrayChunks<I, N>impl<T> Sync for NumBuffer<T>impl Sync for Layoutimpl Sync for uint32x2x3_timpl Sync for vector_bool_longimpl<T: Sync> Sync for Iter<'_, T>impl<I> Sync for Enumerate<I>impl<'a> Sync for Formatter<'a>impl Sync for poly8x8_timpl Sync for float16x4x3_timpl Sync for m128iimpl Sync for Wakerimpl<T> Sync for Wrapping<T>impl<I, F> Sync for Inspect<I, F>impl<'a, T, P> Sync for SplitMut<'a, T, P>impl Sync for float32x2_timpl Sync for float32x2x3_timpl Sync for Lastimpl Sync for vector_signed_shortimpl<T> Sync for Discriminant<T>impl<I> Sync for Peekable<I>impl<'a, T, P> Sync for SplitNMut<'a, T, P>impl Sync for poly8x16_timpl Sync for int64x1x3_timpl Sync for vector_signed_long_longimpl<I> Sync for Take<I>impl<'a, T> Sync for RChunks<'a, T>impl Sync for float32x4_timpl Sync for uint64x1x3_timpl Sync for HvxVectorPairimpl<T> Sync for PhantomData<T>impl<T> Sync for Once<T>impl Sync for ParseBoolErrorimpl Sync for Variantimpl Sync for int8x8x2_timpl Sync for poly64x1x3_timpl<T, N: usize> Sync for Simd<T, N>impl<Idx> Sync for RangeFrom<Idx>impl Sync for IpAddrimpl<'a, P> Sync for SplitTerminator<'a, P>impl Sync for uint8x8x2_timpl Sync for __m128iimpl<N: usize> Sync for [u8; N]impl<T> Sync for Yeet<T>impl Sync for SocketAddrV4impl<'a, P> Sync for Matches<'a, P>impl Sync for poly8x8x2_timpl Sync for __m512iimpl Sync for Strimpl Sync for f16impl Sync for ByteStrimpl<A> Sync for OptionFlatten<A>impl<'a, P> Sync for SplitInclusive<'a, P>impl Sync for int16x4x2_timpl Sync for Boolimpl Sync for __m128himpl Sync for i32impl Sync for ParseCharErrorimpl<Ptr> Sync for Pin<Ptr>impl Sync for SearchStepimpl Sync for uint16x4x2_timpl Sync for float64x1x2_timpl Sync for u64impl Sync for SimdAlignimpl Sync for EscapeDebugimpl<Idx> Sync for RangeFrom<Idx>impl<'a, 'b> Sync for StrSearcher<'a, 'b>impl Sync for poly16x4x2_timpl Sync for v128impl Sync for Referenceimpl<T: PointeeSized> Sync for *mut Timpl Sync for CStrimpl Sync for Orderingimpl<F> Sync for PollFn<F>impl Sync for int32x2x2_timpl Sync for vector_bool_shortimpl<T: ?Sized + Sync> Sync for SyncUnsafeCell<T>impl<P> Sync for MaybeDangling<P>impl<'a> Sync for BorrowedCursor<'a>impl<F> Sync for FromFn<F>impl<'a> Sync for ContextBuilder<'a>impl Sync for uint32x2x2_timpl Sync for vector_unsigned_longimpl Sync for Arguments<'_>impl<I> Sync for Cycle<I>impl Sync for FormattingOptionsimpl Sync for uint8x8_timpl Sync for float16x4x2_timpl Sync for m256dimpl Sync for Pointerimpl<T> Sync for RChunksExactMut<'_, T>impl<I> Sync for Fuse<I>impl<'a, T, P> Sync for SplitInclusive<'a, T, P>impl Sync for Enumimpl Sync for uint32x2_timpl Sync for float32x2x2_timpl Sync for vector_bool_charimpl<I, F, N: usize> Sync for MapWindows<I, F, N>impl<'a, T, P> Sync for RSplitN<'a, T, P>impl Sync for uint8x16_timpl Sync for int64x1x2_timpl Sync for vector_bool_intimpl<I> Sync for StepBy<I>impl<'a, T, N: usize> Sync for ArrayWindows<'a, T, N>impl Sync for uint32x4_timpl Sync for uint64x1x2_timpl Sync for HvxVectorimpl<F> Sync for FromFn<F>impl Sync for Utf8Errorimpl Sync for float16x8_timpl Sync for poly64x1x2_timpl<T, N: usize> Sync for Mask<T, N>impl<Idx> Sync for Range<Idx>impl<T, F> Sync for Successors<T, F>impl<'a, P> Sync for RSplit<'a, P>impl Sync for int8x16x4_timpl Sync for CpuidResultimpl<T, N: usize> Sync for [MaybeUninit<T>; N]impl Sync for OneSidedRangeBoundimpl Sync for SocketAddrimpl<'a, P> Sync for RMatchIndices<'a, P>impl Sync for uint8x16x4_timpl Sync for __m256dimpl<T> Sync for (T)impl<I> Sync for FromIter<I>impl<A> Sync for IntoIter<A>impl<'a> Sync for SplitAsciiWhitespace<'a>impl Sync for poly8x16x4_timpl Sync for __m512bhimpl Sync for i16impl Sync for Abiimpl<T> Sync for TraitImpl<T>impl<'b, T> Sync for RefMut<'b, T>impl<T> Sync for AssertUnwindSafe<T>impl<'a> Sync for Utf8Pattern<'a>impl<Idx> Sync for Clamp<Idx>impl Sync for int16x8x4_timpl Sync for float64x2_timpl Sync for u32impl Sync for EscapeDefaultimpl<Idx> Sync for RangeInclusive<Idx>impl<'a, F> Sync for CharPredicateSearcher<'a, F>impl Sync for uint16x8x4_timpl Sync for float64x2x4_timpl<T: PointeeSized> Sync for *const Timpl Sync for CharCaseimpl<T> Sync for IntoIter<T>impl<T> Sync for Pending<T>impl Sync for poly16x8x4_timpl Sync for vector_unsigned_shortimpl Sync for BasicBlockimpl<T: ?Sized> Sync for UnsafeCell<T>impl<'data> Sync for BorrowedBuf<'data>impl<'a, 'b> Sync for DebugMap<'a, 'b>impl<'a> Sync for Source<'a>impl<'a> Sync for Context<'a>impl Sync for Lifetimeimpl Sync for int32x4x4_timpl Sync for vector_signed_longimpl<T: ?Sized> Sync for Exclusive<T>impl<I> Sync for Copied<I>impl Sync for DebugAsHeximpl Sync for int8x8_timpl Sync for uint32x4x4_timpl Sync for m256impl<T> Sync for RChunksMut<'_, T>impl<T> Sync for Reverse<T>impl Sync for Fieldimpl<I> Sync for Flatten<I>impl<'a, T, P> Sync for Split<'a, T, P>impl Sync for int32x2_timpl Sync for float16x8x4_timpl Sync for vector_unsigned_charimpl<I, P> Sync for MapWhile<I, P>impl<'a, T, P> Sync for SplitN<'a, T, P>impl Sync for int8x16_timpl Sync for float32x4x4_timpl Sync for vector_unsigned_intimpl<I, P> Sync for SkipWhile<I, P>impl<'a, T> Sync for ChunksExact<'a, T>impl Sync for int32x4_timpl Sync for int64x2x4_timpl Sync for vector_doubleimpl Sync for Arrayimpl<G> Sync for FromCoroutine<G>impl Sync for GetDisjointMutErrorimpl Sync for float16x4_timpl Sync for uint64x2x4_timpl Sync for HvxVectorPredimpl Sync for RangeFullimpl<F> Sync for RepeatWith<F>impl<'a, P> Sync for Split<'a, P>impl Sync for int8x16x3_timpl Sync for poly64x2x4_timpl Sync for ()impl<T> Sync for Bound<T>impl Sync for AddrParseErrorimpl<'a, P> Sync for MatchIndices<'a, P>impl Sync for uint8x16x3_timpl Sync for __m256impl Sync for strimpl Sync for TypeKindimpl Sync for EscapeDefaultimpl<'a, A> Sync for IterMut<'a, A>impl Sync for Structimpl<'a> Sync for SplitWhitespace<'a>impl Sync for poly8x16x3_timpl Sync for __m256bhimpl Sync for i8impl<T> Sync for PhantomCovariant<T>impl<'b, T> Sync for Ref<'b, T>impl<'a> Sync for PanicMessage<'a>impl<'a> Sync for EscapeUnicode<'a>impl Sync for int16x8x3_timpl Sync for float64x1_timpl Sync for u16impl Sync for AtomicOrderingimpl Sync for EscapeUnicodeimpl<Idx> Sync for Range<Idx>impl<'a, 'b> Sync for CharSliceSearcher<'a, 'b>impl Sync for uint16x8x3_timpl Sync for float64x2x3_timpl<Ret, T> Sync for fn(_: T) -> Retimpl Sync for Tupleimpl Sync for TryFromCharErrorimpl<'a, T> Sync for IterMut<'a, T>impl Sync for Unionimpl Sync for TryFromFloatSecsErrorimpl Sync for poly16x8x3_timpl Sync for Charimpl Sync for vector_signed_shortimpl<T: ?Sized> Sync for RefCell<T>impl<T> Sync for NonZero<T>impl Sync for c_voidimpl<'a, 'b> Sync for DebugList<'a, 'b>impl Sync for RawWakerVTableimpl Sync for int32x4x3_timpl Sync for vector_floatimpl<T: AtomicPrimitive> Sync for Atomic<T>impl<T> Sync for PhantomContravariant<T>impl<T, F> Sync for DropGuard<T, F>impl<I> Sync for Cloned<I>impl Sync for Signimpl Sync for SYimpl Sync for uint32x4x3_timpl Sync for m256iimpl<T> Sync for ChunksExactMut<'_, T>impl<I, U, F> Sync for FlatMap<I, U, F>impl<'a> Sync for EscapeAscii<'a>impl Sync for poly16x4_timpl Sync for float16x8x3_timpl Sync for Intimpl Sync for vector_signed_charimpl Sync for UnwindTerminateReasonimpl<I, F> Sync for Map<I, F>impl<'a, T, P> Sync for RSplitMut<'a, T, P>impl Sync for poly64x1_timpl Sync for GenericTypeimpl Sync for float32x4x3_timpl Sync for vector_signed_intimpl<I> Sync for Skip<I>impl<'a, T> Sync for Chunks<'a, T>impl Sync for FpCategoryimpl Sync for poly16x8_timpl Sync for int64x2x3_timpl Sync for vector_floatimpl<'a> Sync for PhantomInvariantLifetime<'a>impl<T> Sync for PhantomInvariant<T>impl<T> Sync for Empty<T>impl<'a, T, P> Sync for ChunkByMut<'a, T, P>impl Sync for poly64x2_timpl Sync for uint64x2x3_timpl Sync for HvxVectorPairimpl Sync for FnPtrimpl Sync for Typeimpl<Y, R> Sync for CoroutineState<Y, R>impl<A> Sync for RepeatN<A>impl<'a> Sync for Bytes<'a>impl Sync for int8x16x2_timpl Sync for poly64x2x3_timpl Sync for charimpl<Idx> Sync for RangeToInclusive<Idx>impl Sync for Ipv6MulticastScopeimpl<'a, P> Sync for RSplitN<'a, P>impl Sync for uint8x16x2_timpl Sync for __m256iimpl<T> Sync for [T]impl Sync for AsciiCharimpl Sync for Sliceimpl<'a, A> Sync for Iter<'a, A>impl<'a> Sync for LinesAny<'a>impl Sync for poly8x16x2_timpl Sync for __m128bhimpl Sync for f128impl Sync for ReturnToArgimpl Sync for BorrowMutErrorimpl<'a> Sync for PanicInfo<'a>impl<'a> Sync for EscapeDefault<'a>impl Sync for int16x8x2_timpl Sync for bf16impl Sync for u8impl Sync for Orderingimpl Sync for DecodeUtf16Errorimpl<A> Sync for RangeFromIter<A>impl<'a> Sync for Request<'a>impl<'a, 'b, N: usize> Sync for CharArrayRefSearcher<'a, 'b, N>impl Sync for uint16x8x2_timpl Sync for float64x2x2_timpl Sync for usizeimpl Sync for ParseFloatErrorimpl Sync for ToLowercaseimpl Sync for DynTraitimpl<'a, T> Sync for Iter<'a, T>impl Sync for Durationimpl Sync for Localityimpl Sync for poly16x8x2_timpl Sync for vector_bool_charimpl<T: ?Sized> Sync for Cell<T>impl<'a> Sync for VaList<'a>