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