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 ParseBoolErrorimpl<T> Sync for (T)impl Sync for int32x2_timpl<'a> Sync for Request<'a>impl Sync for CharTryFromErrorimpl Sync for poly16x8x2_timpl Sync for Ipv4Addrimpl Sync for __m512impl Sync for ReturnToArgimpl<'a, T, P> Sync for RSplitN<'a, T, P>impl<N: usize> Sync for LaneCount<N>impl Sync for TryFromIntErrorimpl Sync for RawWakerVTableimpl Sync for AtomicUsizeimpl<T> Sync for Yeet<T>impl Sync for int16x4x4_timpl<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 Sync for Location<'_>impl Sync for uint8x8x3_timpl<I> Sync for Fuse<I>impl Sync for int64x1x2_timpl<'a, T> Sync for IterMut<'a, T>impl Sync for vector_floatimpl<'a> Sync for Lines<'a>impl Sync for u128impl Sync for float32x4_timpl<'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 Sync for f16impl Sync for uint32x2_timpl<I> Sync for DecodeUtf16<I>impl Sync for poly16x8x3_timpl Sync for Ipv6Addrimpl Sync for __m512dimpl<'a, T, P> Sync for SplitNMut<'a, T, P>impl<T, N: usize> Sync for Mask<T, N>impl<'a> Sync for Context<'a>impl<T: ?Sized> Sync for Exclusive<T>impl<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> Sync for UnsafePinned<T>impl<T> Sync for PhantomData<T>impl Sync for uint8x8x4_timpl<T> Sync for PhantomCovariant<T>impl Sync for IntErrorKindimpl<I, F> Sync for Inspect<I, F>impl Sync for int64x1x3_timpl<T> Sync for IntoIter<T>impl Sync for vector_signed_longimpl<'a> Sync for LinesAny<'a>impl Sync for isizeimpl 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 Sync for f32impl Sync for float32x2_timpl Sync for DecodeUtf16Errorimpl Sync for poly16x8x4_timpl Sync for Ipv6MulticastScopeimpl Sync for __m128bhimpl<'a, T, P> Sync for RSplitNMut<'a, T, P>impl<T, N: usize> Sync for Simd<T, N>impl<'a> Sync for ContextBuilder<'a>impl Sync for Arguments<'_>impl Sync for Arrayimpl Sync for TryFromSliceErrorimpl Sync for int16x8x3_timpl<A, B> Sync for Zip<A, B>impl Sync for poly64x2x2_timpl<'a> Sync for Formatter<'a>impl Sync for vector_signed_shortimpl<'a, F> Sync for CharPredicateSearcher<'a, F>impl Sync for AtomicBoolimpl Sync for PhantomPinnedimpl Sync for uint8x16x2_timpl Sync for AtomicOrderingimpl<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 usizeimpl Sync for uint64x2_timpl<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 Sync for f64impl Sync for int64x1_timpl Sync for EscapeUnicodeimpl Sync for int32x2x2_timpl Sync for BasicBlockimpl Sync for AddrParseErrorimpl Sync for __m256bhimpl<'a, T> Sync for Windows<'a, T>impl Sync for boolimpl Sync for Layoutimpl<T: Sync> Sync for Iter<'_, T>impl 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> Sync for AtomicPtr<T>impl<B, C> Sync for ControlFlow<B, C>impl Sync for uint8x16x3_timpl<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<Ret, T> Sync for fn(_: T) -> Retimpl Sync for poly64x2_timpl<'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 f128impl Sync for uint64x1_timpl<'a> Sync for PhantomInvariantLifetime<'a>impl Sync for EscapeDefaultimpl Sync for int32x2x3_timpl Sync for SocketAddrimpl Sync for __m512bhimpl Sync for FpCategoryimpl<'a, T> Sync for Chunks<'a, T>impl Sync for neverimpl Sync for TypeKindimpl Sync for LayoutErrorimpl<T: Sync> Sync for IterMut<'_, T>impl Sync for EscapeDefaultimpl Sync for uint16x4x2_timpl<G> Sync for FromCoroutine<G>impl Sync for poly64x2x4_timpl<H> Sync for BuildHasherDefault<H>impl Sync for vector_bool_shortimpl Sync for Infallibleimpl Sync for Lastimpl<'a> Sync for Utf8Chunk<'a>impl Sync for AtomicI8impl<Y, R> Sync for CoroutineState<Y, R>impl Sync for uint8x16x4_timpl<I, F> Sync for Map<I, F>impl Sync for int64x2x3_timpl<'a, 'b> Sync for DebugTuple<'a, 'b>impl Sync for vector_doubleimpl<'a, P> Sync for SplitInclusive<'a, P>impl<T: PointeeSized> Sync for *const Timpl Sync for float16x4_timpl<A, B> Sync for Chain<A, B>impl Sync for float16x8x2_timpl<A> Sync for RangeIter<A>impl Sync for vector_signed_charimpl<'a, P> Sync for RSplit<'a, P>impl Sync for i8impl Sync for poly64x1_timpl Sync for EscapeDebugimpl Sync for int32x2x4_timpl Sync for SocketAddrV4impl Sync for __m128himpl<T, F> Sync for DropGuard<T, F>impl<'a, T> Sync for ChunksExact<'a, T>impl Sync for charimpl Sync for AllocErrorimpl<T> Sync for ChunksMut<'_, T>impl<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 Sync for Localityimpl<'a> Sync for Utf8Chunks<'a>impl Sync for AtomicU8impl 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<T: PointeeSized> Sync for *mut Timpl Sync for float16x8_timpl<I> Sync for Cloned<I>impl Sync for float16x8x3_timpl Sync for UnwindTerminateReasonimpl<A> Sync for RangeInclusiveIter<A>impl Sync for vector_unsigned_charimpl<'a, P> Sync for SplitTerminator<'a, P>impl Sync for i16impl<T> Sync for Saturating<T>impl 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 Sync for ()impl Sync for SYimpl<T> Sync for ChunksExactMut<'_, T>impl Sync for ByteStrimpl Sync for uint16x4x4_timpl<Idx> Sync for Clamp<Idx>impl<T> Sync for Once<T>impl Sync for __m128iimpl<'a, T, P> Sync for Split<'a, T, P>impl Sync for vector_unsigned_intimpl Sync for Durationimpl Sync for AtomicI16impl<'a> Sync for PhantomContravariantLifetime<'a>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<'a> Sync for EscapeDebug<'a>impl Sync for TypeIdimpl 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<Dyn: PointeeSized> Sync for DynMetadata<Dyn>impl<'a, P> Sync for RSplitTerminator<'a, P>impl Sync for i32impl 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 [MaybeUninit<T>; N]impl Sync for int8x8_timpl<T> Sync for RChunksMut<'_, T>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 AtomicU16impl<Idx> Sync for RangeFrom<Idx>impl Sync for poly8x8x4_timpl<I> Sync for Peekable<I>impl Sync for uint64x1x3_timpl<'a, 'b> Sync for DebugMap<'a, 'b>impl Sync for m256impl Sync for Typeimpl<'a> Sync for EscapeDefault<'a>impl<T> Sync for OnceCell<T>impl Sync for int8x8x3_timpl<I> Sync for Cycle<I>impl Sync for float32x2x2_timpl<T> Sync for PhantomInvariant<T>impl Sync for Assumeimpl<Idx> Sync for Range<Idx>impl Sync for vector_signed_shortimpl<'a, P> Sync for SplitN<'a, P>impl Sync for i64impl<'a> Sync for PhantomCovariantLifetime<'a>impl Sync for Tupleimpl Sync for poly8x16_timpl<T> Sync for MaybeUninit<T>impl<T: PointeeSized> Sync for NonNull<T>impl 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<N: usize> Sync for [u8; N]impl Sync for uint8x8_timpl<T> Sync for RChunksExactMut<'_, T>impl Sync for BorrowErrorimpl Sync for uint16x8x3_timpl<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 Sync for AtomicI32impl<Idx> Sync for RangeTo<Idx>impl Sync for poly8x16x2_timpl<T> Sync for Rev<T>impl Sync for uint64x1x4_timpl Sync for UnwindActionArgimpl<F> Sync for FromFn<F>impl Sync for m256dimpl<'a> Sync for EscapeUnicode<'a>impl<T: ?Sized> Sync for Cell<T>impl 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 i128impl 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<T, N: usize> Sync for [T; N]impl<T> Sync for ManuallyDrop<T>impl Sync for poly8x8_timpl Sync for Wakerimpl 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 AtomicU32impl<Idx> Sync for RangeInclusive<Idx>impl Sync for poly8x16x3_timpl<P> Sync for MaybeDangling<P>impl<I, St, F> Sync for Scan<I, St, F>impl Sync for uint64x2x2_timpl<T> Sync for Wrapping<T>impl<T> Sync for NumBuffer<T>impl Sync for m128iimpl<'a> Sync for Utf8Pattern<'a>impl<T: ?Sized> Sync for RefCell<T>impl 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<'a, P> Sync for MatchIndices<'a, P>impl Sync for u8impl Sync for uint16x8_timpl<T> Sync for NonZero<T>impl 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<T, N: usize> Sync for [Option<T>; N]impl Sync for int16x4_timpl Sync for LocalWakerimpl<'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 AtomicI64impl<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: ?Sized> Sync for UnsafeCell<T>impl Sync for int8x16x3_timpl<T> Sync for Discriminant<T>impl<I, F> Sync for FilterMap<I, F>impl Sync for float32x4x2_timpl<Idx> Sync for RangeToInclusive<Idx>impl Sync for vector_signed_intimpl<'a, P> Sync for RMatchIndices<'a, P>impl Sync for u16impl Sync for poly16x8_timpl Sync for FromBytesUntilNulErrorimpl Sync for uint32x2x4_timpl Sync for Alignmentimpl<A> Sync for OptionFlatten<A>impl Sync for float64x1x2_timpl Sync for GetDisjointMutErrorimpl<T> Sync for [T]impl Sync for uint16x4_timpl Sync for ParseIntErrorimpl<'b, T> Sync for RefMut<'b, T>impl Sync for poly16x4x3_timpl<T> Sync for PhantomContravariant<T>impl<T, F> Sync for Successors<T, F>impl Sync for __m256dimpl<T> Sync for Reverse<T>impl<'a, T, P> Sync for RSplitMut<'a, T, P>impl Sync for vector_floatimpl<T> Sync for Poll<T>impl Sync for AtomicU64impl<T> Sync for Bound<T>impl Sync for int16x4x2_timpl<I, P> Sync for SkipWhile<I, P>impl Sync for uint64x2x4_timpl Sync for Errorimpl Sync for m128dimpl<'a> Sync for CharSearcher<'a>impl<T: ?Sized + Sync> Sync for SyncUnsafeCell<T>impl Sync for Fieldimpl 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 u32impl Sync for SimdAlignimpl Sync for int32x4_timpl<'a> Sync for VaList<'a>impl Sync for uint32x4x2_timpl Sync for objc_classimpl Sync for float64x1x3_timpl Sync for Utf8Errorimpl Sync for strimpl Sync for poly16x4_timpl Sync for ParseCharErrorimpl Sync for poly16x4x4_timpl 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 AtomicIsizeimpl 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 Sync for Bytes<'_>impl Sync for uint8x8x2_timpl<I> Sync for Flatten<I>impl Sync for float32x4x4_timpl Sync for Orderingimpl<'a, T> Sync for Iter<'a, T>impl Sync for vector_bool_intimpl<'a, P> Sync for RMatches<'a, P>impl Sync for u64impl Sync for uint32x4_timpl<'a> Sync for Source<'a>impl Sync for c_voidimpl Sync for uint32x4x3_timpl Sync for objc_selectorimpl Sync for float64x1x4_t