Trait core::marker::Sync

1.0.0 · source · []
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.

Implementors

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

impl<T: ?Sized + Sync> Sync for ThinBox<T>

impl<T: Sync> Sync for LinkedList<T>

impl<T: Sync> Sync for Iter<'_, T>

impl<T: Sync> Sync for IterMut<'_, T>

impl<T: Sync> Sync for Cursor<'_, T>

impl<T: Sync> Sync for CursorMut<'_, T>

impl<T: Sync, A: Allocator + Sync> Sync for Drain<'_, T, A>

impl<T: Sync> Sync for IterMut<'_, T>

impl<T: ?Sized> !Sync for Rc<T>

impl<T: ?Sized> !Sync for Weak<T>

impl Sync for Drain<'_>

impl<T: ?Sized + Sync + Send> Sync for Arc<T>

impl<T: ?Sized + Sync + Send> Sync for Weak<T>

impl<T: Sync, A: Sync + Allocator> Sync for Drain<'_, T, A>

impl<T: Sync, A: Allocator + Sync> Sync for IntoIter<T, A>

impl !Sync for TokenStream

impl !Sync for LexError

impl !Sync for ExpandError

impl !Sync for Span

impl !Sync for LineColumn

impl !Sync for TokenTree

impl !Sync for Group

impl !Sync for Punct

impl<T> Sync for JoinHandle<T>

impl !Sync for Args

impl !Sync for ArgsOs

impl<'a> Sync for IoSliceMut<'a>

impl<'a> Sync for IoSlice<'a>

impl Sync for OwnedHandle

impl Sync for BorrowedHandle<'_>

impl<T> !Sync for Receiver<T>

impl<T> !Sync for Sender<T>

impl<T, F: Send> Sync for LazyLock<T, F>where
    OnceLock<T>: Sync,

impl<T: ?Sized + Send> Sync for Mutex<T>

impl<T: ?Sized + Sync> Sync for MutexGuard<'_, T>

impl<T: Sync + Send> Sync for OnceLock<T>

impl<T: ?Sized + Send + Sync> Sync for RwLock<T>

impl<T: ?Sized + Sync> Sync for RwLockReadGuard<'_, T>

impl<T: ?Sized + Sync> Sync for RwLockWriteGuard<'_, T>

Auto implementors

impl Sync for Global

impl<T: ?Sized, A> Sync for Box<T, A>where
    A: Sync,
    T: Sync,

impl<'a, B: ?Sized> Sync for Cow<'a, B>where
    B: Sync,
    <B as ToOwned>::Owned: Sync,

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

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

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

impl<T> Sync for IntoIter<T>where
    T: Sync,

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

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

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

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

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

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

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

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

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

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

impl<K, V, A> Sync for IntoIter<K, V, A>where
    A: Sync,
    K: Sync,
    V: Sync,

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

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

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

impl<K, V, A> Sync for IntoKeys<K, V, A>where
    A: Sync,
    K: Sync,
    V: Sync,

impl<K, V, A> Sync for IntoValues<K, V, A>where
    A: Sync,
    K: Sync,
    V: Sync,

impl<'a, K, V> Sync for 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, F, A> Sync for DrainFilter<'a, K, V, F, A>where
    A: Sync,
    F: Sync,
    K: Sync,
    V: Sync,

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

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

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

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

impl<'a, T, A> Sync for Difference<'a, T, A>where
    A: Sync,
    T: Sync,

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

impl<'a, T, A> Sync for Intersection<'a, T, A>where
    A: Sync,
    T: Sync,

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

impl<'a, T, F, A> Sync for DrainFilter<'a, T, F, A>where
    A: Sync,
    F: Sync,
    T: Sync,

impl<T> Sync for IntoIter<T>where
    T: Sync,

impl<'a, T, F> !Sync for DrainFilter<'a, T, F>

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

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

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

impl Sync for CString

impl Sync for NulError

impl Sync for String

impl<'a, T, F, A> Sync for DrainFilter<'a, T, F, A>where
    A: Sync,
    F: Sync,
    T: Sync,

impl<'a, I, A> Sync for Splice<'a, I, A>where
    A: Sync,
    I: Sync,
    <I as Iterator>::Item: Sync,

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

impl Sync for Level

impl !Sync for Diagnostic

impl !Sync for IntoIter

impl !Sync for SourceFile

impl Sync for Delimiter

impl Sync for Spacing

impl !Sync for Ident

impl !Sync for Literal

impl<T> Sync for LocalKey<T>

impl Sync for AccessError

impl<'scope, 'env> Sync for Scope<'scope, 'env>

impl<'scope, T> Sync for ScopedJoinHandle<'scope, T>where
    T: Send + Sync,

impl Sync for Builder

impl Sync for ThreadId

impl Sync for Thread

impl Sync for Backtrace

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

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

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

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

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

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

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

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

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

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

impl<K, V> Sync for IntoValues<K, V>where
    K: 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 RawEntryMut<'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,
    S: Sync,
    V: Sync,

impl<'a, K, V, S> Sync for RawVacantEntryMut<'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> Sync for Entry<'a, K, V>where
    K: Sync,
    V: Sync,

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

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

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

impl Sync for RandomState

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

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

impl<K> Sync for IntoIter<K>where
    K: Sync,

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

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

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

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

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

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

impl !Sync for Vars

impl !Sync for VarsOs

impl Sync for VarError

impl<'a> Sync for SplitPaths<'a>

impl<E> Sync for Report<E>where
    E: Sync,

impl Sync for OsString

impl Sync for OsStr

impl Sync for File

impl Sync for Metadata

impl Sync for ReadDir

impl Sync for DirEntry

impl Sync for OpenOptions

impl Sync for FileTimes

impl Sync for Permissions

impl Sync for FileType

impl Sync for DirBuilder

impl<R> Sync for BufReader<R>where
    R: Sync,

impl<W> Sync for BufWriter<W>where
    W: Sync,

impl<W> Sync for LineWriter<W>where
    W: Sync,

impl<W> Sync for IntoInnerError<W>where
    W: Sync,

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

impl Sync for Error

impl Sync for ErrorKind

impl<'data> Sync for BorrowedBuf<'data>

impl<'a> Sync for BorrowedCursor<'a>

impl Sync for Stdin

impl<'a> Sync for StdinLock<'a>

impl Sync for Stdout

impl<'a> Sync for StdoutLock<'a>

impl Sync for Stderr

impl<'a> Sync for StderrLock<'a>

impl Sync for Empty

impl Sync for Repeat

impl Sync for Sink

impl Sync for SeekFrom

impl<T, U> Sync for Chain<T, U>where
    T: Sync,
    U: Sync,

impl<T> Sync for Take<T>where
    T: Sync,

impl<R> Sync for Bytes<R>where
    R: Sync,

impl<B> Sync for Split<B>where
    B: Sync,

impl<B> Sync for Lines<B>where
    B: Sync,

impl Sync for IpAddr

impl Sync for Ipv4Addr

impl Sync for Ipv6Addr

impl Sync for SocketAddr

impl Sync for TcpStream

impl Sync for TcpListener

impl<'a> Sync for Incoming<'a>

impl Sync for UdpSocket

impl Sync for Shutdown

impl Sync for SocketAddr

impl Sync for SocketCred

impl<'a> Sync for ScmRights<'a>

impl<'a> Sync for ScmCredentials<'a>

impl<'a> Sync for AncillaryData<'a>

impl<'a> Sync for Messages<'a>

impl<'a> Sync for SocketAncillary<'a>

impl<'a> Sync for Incoming<'a>

impl Sync for UnixStream

impl Sync for UCred

impl Sync for PidFd

impl Sync for stat

impl<'a> Sync for EncodeWide<'a>

impl<'socket> Sync for BorrowedSocket<'socket>

impl Sync for OwnedSocket

impl<'fd> Sync for BorrowedFd<'fd>

impl Sync for OwnedFd

impl<'a> Sync for Prefix<'a>

impl<'a> Sync for PrefixComponent<'a>

impl<'a> Sync for Component<'a>

impl<'a> Sync for Components<'a>

impl<'a> Sync for Iter<'a>

impl<'a> Sync for Ancestors<'a>

impl Sync for PathBuf

impl Sync for Path

impl<'a> Sync for Display<'a>

impl<'a> Sync for CommandEnvs<'a>

impl Sync for Child

impl Sync for ChildStdin

impl Sync for ChildStdout

impl Sync for ChildStderr

impl Sync for Command

impl<'a> Sync for CommandArgs<'a>

impl Sync for Output

impl Sync for Stdio

impl Sync for ExitStatus

impl Sync for ExitCode

impl<'a, T> !Sync for Iter<'a, T>

impl<'a, T> !Sync for TryIter<'a, T>

impl<T> !Sync for IntoIter<T>

impl<T> Sync for SyncSender<T>where
    T: Send,

impl<T> Sync for SendError<T>where
    T: Sync,

impl Sync for RecvError

impl<T> Sync for TrySendError<T>where
    T: Sync,

impl Sync for Barrier

impl Sync for Condvar

impl Sync for Once

impl !Sync for OnceState

impl<T> Sync for PoisonError<T>where
    T: Sync,

impl<T> Sync for TryLockError<T>where
    T: Sync,

impl Sync for Instant

impl Sync for SystemTime

impl Sync for System

impl<Ret, T> Sync for fn (T₁, T₂, …, Tₙ) -> Ret

impl Sync for ()

impl<T> Sync for (T₁, T₂, …, Tₙ)where
    T: Sync,

impl Sync for f64

impl Sync for f32

impl Sync for TestOpts

impl Sync for Metric

impl Sync for MetricMap

impl Sync for Concurrent

impl Sync for Options

impl Sync for RunIgnored

impl Sync for RunStrategy

impl Sync for ShouldPanic

impl Sync for TestResult

impl Sync for TestDesc

impl Sync for TestId

impl Sync for TestName

impl Sync for TestType

impl Sync for Bencher

impl Sync for ColorConfig

impl Sync for Summary

impl Sync for NamePadding

impl !Sync for TestFn