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: 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<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: ?Sized + Send> Sync for Mutex<T>

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

impl Sync for Once

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>

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

impl<T, F: Send> Sync for SyncLazy<T, F> where
    SyncOnceCell<T>: Sync

Auto implementors

impl Sync for Global

impl<T> !Sync for ThinBox<T>

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<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<'a> !Sync for Chain<'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 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<'a> Sync for ReadBuf<'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 SocketAddr

impl Sync for IpAddr

impl Sync for Ipv4Addr

impl Sync for Ipv6Addr

impl Sync for TcpStream

impl Sync for TcpListener

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

impl Sync for UdpSocket

impl Sync for Shutdown

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

impl Sync for OwnedFd

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<'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 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 Sync for ()

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

impl Sync for f64

impl Sync for f32