Trait std::marker::Sync1.0.0[][src]

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.

Implementations on Foreign Types

Implementors

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 for IntoIter<T, A>

impl<T: Send, S: Sync> Sync for Sender<T, S>

impl<T: Send, S: Sync> Sync for AsyncSender<T, S>

Auto implementors

impl Sync for AesmError

impl Sync for Error

impl Sync for QuoteType

impl Sync for QuoteInfo

impl Sync for QuoteResult

impl Sync for AesmClient

impl<'a> Sync for Quote<'a>

impl<'a> Sync for QuoteHeader<'a>

impl<'a> Sync for Qe3CertDataPpid<'a>

impl<'a> Sync for Qe3CertDataPckCertChain<'a>

impl Sync for Quote3Error

impl !Sync for Command

impl !Sync for Library

impl<'a> !Sync for EnclaveBuilder<'a>

impl<T> Sync for WithId<T> where
    T: Sync

impl Sync for Usercall

impl Sync for Return

impl<T> !Sync for FifoDescriptor<T>

impl !Sync for ByteBuffer

impl Sync for Error

impl Sync for Usercalls

impl Sync for Request

impl Sync for Addr

impl Sync for Response

impl Sync for Server

impl<T> Sync for Identified<T> where
    T: Sync

impl Sync for QueueEvent

impl Sync for SendError

impl Sync for RecvError

impl<T, S> !Sync for Receiver<T, S>

impl<T, S> !Sync for AsyncReceiver<T, S>

impl<T> !Sync for DescriptorGuard<T>

impl Sync for Encls

impl Sync for Enclu

impl Sync for ErrorCode

impl Sync for PageType

impl Sync for Keyname

impl Sync for Secs

impl Sync for Attributes

impl Sync for Miscselect

impl Sync for Tcs

impl Sync for TcsFlags

impl Sync for Pageinfo

impl Sync for Secinfo

impl Sync for Pcmd

impl Sync for Sigstruct

impl Sync for Einittoken

impl Sync for Report

impl Sync for Targetinfo

impl Sync for Keyrequest

impl Sync for Keypolicy

impl Sync for sgxCpusvn

impl Sync for sgxMrsigner

impl Sync for sgxIsvsvn

impl Sync for SgxName

impl<'a, 'b> Sync for AttestationInlineSgxLocal<'a, 'b>

impl<'a, 'b, 'c> Sync for AttestationEmbeddedIasReport<'a, 'b, 'c>

impl<'a, 'b> Sync for AttestationEmbeddedFqpe<'a, 'b>

impl Sync for QuoteResult

impl Sync for Error

impl<T: ?Sized> Sync for Mapping<T> where
    <T as Load>::MappingInfo: Sync,
    <T as Load>::Tcs: Sync

impl Sync for Error

impl Sync for Meas

impl Sync for PageChunks

impl<'a, R> Sync for CanonicalSgxsReader<'a, R> where
    R: Sync

impl<'a, R> Sync for PageReader<'a, R> where
    R: Sync

impl Sync for CreateInfo

impl Sync for PageChunk

impl<'a, R> Sync for MeasuredData<'a, R> where
    R: Sync

impl<'a, W> Sync for CanonicalSgxsWriter<'a, W> where
    W: Sync

impl Sync for MeasECreate

impl Sync for MeasEAdd

impl Sync for MeasEExtend

impl Sync for EnclaveHash

impl Sync for Signer

impl Sync for Error

impl !Sync for Device

impl Sync for Error

impl !Sync for Library

impl Sync for Tcs

impl Sync for MappingInfo