pub unsafe auto trait Send { }Expand description
Types that can be transferred across thread boundaries.
This trait is automatically implemented when the compiler determines it’s appropriate.
An example of a non-Send type is the reference-counting pointer
rc::Rc. If two threads attempt to clone Rcs that point to the same
reference-counted value, they might try to update the reference count at the
same time, which is undefined behavior because Rc doesn’t use atomic
operations. Its cousin sync::Arc does use atomic operations (incurring
some overhead) and thus is Send.
See the Nomicon and the Sync trait for more details.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementors§
impl !Send for Args
impl !Send for ArgsOs
impl !Send for Arguments<'_>
impl !Send for LocalWaker
impl !Send for VarsOs
impl Send for Arena
impl Send for ArenaHandle<'_>
impl Send for Atom
Immutable, so it’s safe to be shared between threads
impl Send for bytes::bytes::Bytes
impl Send for core::ffi::c_str::Bytes<'_>
impl Send for BytesMut
impl Send for alloc::string::Drain<'_>
impl Send for Location<'_>
impl Send for TypeId
impl Send for Waker
impl Send for Wtf8Atom
Immutable, so it’s safe to be shared between threads
impl<'a, 'b, K, Q, V, S, A> Send for OccupiedEntryRef<'a, 'b, K, Q, V, S, A>
impl<'a, R, T> Send for lock_api::mutex::MappedMutexGuard<'a, R, T>
impl<'a, R, T> Send for lock_api::rwlock::MappedRwLockReadGuard<'a, R, T>
impl<'a, R, T> Send for lock_api::rwlock::MappedRwLockWriteGuard<'a, R, T>
impl<'a, T, O> Send for bitvec::slice::iter::Iter<'a, T, O>
impl<'a, T, O> Send for bitvec::slice::iter::IterMut<'a, T, O>
impl<'a, T> Send for ArcBorrow<'a, T>
impl<'a, T> Send for smallvec::Drain<'a, T>
impl<'a, T> Send for ZeroVec<'a, T>
impl<'a> Send for IoSlice<'a>
impl<'a> Send for IoSliceMut<'a>
impl<A, B> Send for ArcUnion<A, B>
impl<A> Send for SmallVec<A>
impl<C> Send for CartableOptionPointer<C>where
C: Sync + CartablePointerLike,
impl<Dyn> Send for core::ptr::metadata::DynMetadata<Dyn>where
Dyn: ?Sized,
impl<Dyn> Send for ptr_meta::DynMetadata<Dyn>where
Dyn: ?Sized,
impl<H, T> Send for ThinArc<H, T>
impl<K, V, S, A> Send for hashbrown::map::OccupiedEntry<'_, K, V, S, A>
impl<K, V, S, A> Send for hashbrown::map::OccupiedEntry<'_, K, V, S, A>
impl<K, V, S, A> Send for RawOccupiedEntryMut<'_, K, V, S, A>
impl<K, V> Send for hashbrown::map::IterMut<'_, K, V>
impl<K, V> Send for hashbrown::map::IterMut<'_, K, V>
impl<M, T, O> Send for BitRef<'_, M, T, O>
impl<R, G, T> Send for ReentrantMutex<R, G, T>
impl<R, G> Send for RawReentrantMutex<R, G>
impl<R, T> Send for lock_api::mutex::Mutex<R, T>
impl<R, T> Send for lock_api::rwlock::RwLock<R, T>
impl<T, A> !Send for Rc<T, A>
impl<T, A> !Send for UniqueRc<T, A>
impl<T, A> !Send for alloc::rc::Weak<T, A>
impl<T, A> Send for swc_common::sync::Lrc<T, A>
impl<T, A> Send for Box<T, A>
impl<T, A> Send for Cursor<'_, T, A>
impl<T, A> Send for CursorMut<'_, T, A>
impl<T, A> Send for alloc::collections::vec_deque::drain::Drain<'_, T, A>
impl<T, A> Send for alloc::vec::drain::Drain<'_, T, A>
impl<T, A> Send for allocator_api2::stable::vec::drain::Drain<'_, T, A>
impl<T, A> Send for alloc::vec::into_iter::IntoIter<T, A>
impl<T, A> Send for allocator_api2::stable::vec::into_iter::IntoIter<T, A>
impl<T, A> Send for LinkedList<T, A>
impl<T, A> Send for hashbrown::table::OccupiedEntry<'_, T, A>
impl<T, A> Send for hashbrown::table::OccupiedEntry<'_, T, A>
impl<T, A> Send for alloc::sync::UniqueArc<T, A>
impl<T, A> Send for alloc::sync::Weak<T, A>
impl<T, O> Send for BitBox<T, O>
impl<T, O> Send for BitSlice<T, O>
§Bit-Slice Thread Safety
This allows bit-slice references to be moved across thread boundaries only when
the underlying T element can tolerate concurrency.
All BitSlice references, shared or exclusive, are only threadsafe if the T
element type is Send, because any given bit-slice reference may only have
partial control of a memory element that is also being shared by a bit-slice
reference on another thread. As such, this is never implemented for Cell<U>,
but always implemented for AtomicU and U for a given unsigned integer type
U.
Atomic integers safely handle concurrent writes, cells do not allow concurrency
at all, so the only missing piece is &mut BitSlice<_, U: Unsigned>. This is
handled by the aliasing system that the mutable splitters employ: a mutable
reference to an unsynchronized bit-slice can only cross threads when no other
handle is able to exist to the elements it governs. Splitting a mutable
bit-slice causes the split halves to change over to either atomics or cells, so
concurrency is either safe or impossible.
impl<T, O> Send for BitVec<T, O>
impl<T, O> Send for bitvec::vec::iter::Drain<'_, T, O>
impl<T, O> Send for bitvec::boxed::iter::IntoIter<T, O>
impl<T, const N: usize> Send for InlineVec<T, N>where
T: Send,
impl<T> !Send for *const Twhere
T: ?Sized,
impl<T> !Send for *mut Twhere
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::mutex::MappedMutexGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::poison::mutex::MappedMutexGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::rwlock::MappedRwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::poison::rwlock::MappedRwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::rwlock::MappedRwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::poison::rwlock::MappedRwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::mutex::MutexGuard<'_, T>where
T: ?Sized,
A MutexGuard is not Send to maximize platform portability.
On platforms that use POSIX threads (commonly referred to as pthreads) there is a requirement to
release mutex locks on the same thread they were acquired.
For this reason, MutexGuard must not implement Send to prevent it being dropped from
another thread.
impl<T> !Send for std::sync::poison::mutex::MutexGuard<'_, T>where
T: ?Sized,
A MutexGuard is not Send to maximize platform portability.
On platforms that use POSIX threads (commonly referred to as pthreads) there is a requirement to
release mutex locks on the same thread they were acquired.
For this reason, MutexGuard must not implement Send to prevent it being dropped from
another thread.
impl<T> !Send for NonNull<T>where
T: ?Sized,
NonNull pointers are not Send because the data they reference may be aliased.
impl<T> !Send for ReentrantLockGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::rwlock::RwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::poison::rwlock::RwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::nonpoison::rwlock::RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for std::sync::poison::rwlock::RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> Send for &T
impl<T> Send for triomphe::arc::Arc<T>
impl<T> Send for Atomic<T>where
T: AtomicPrimitive,
impl<T> Send for BitSpanError<T>where
T: BitStore,
impl<T> Send for Cell<T>
impl<T> Send for ChunksExactMut<'_, T>where
T: Send,
impl<T> Send for ChunksMut<'_, T>where
T: Send,
impl<T> Send for core::slice::iter::Iter<'_, T>where
T: Sync,
impl<T> Send for alloc::collections::linked_list::Iter<'_, T>where
T: Sync,
impl<T> Send for core::slice::iter::IterMut<'_, T>where
T: Send,
impl<T> Send for alloc::collections::linked_list::IterMut<'_, T>where
T: Send,
impl<T> Send for JoinHandle<T>
impl<T> Send for MisalignError<T>
impl<T> Send for std::sync::nonpoison::mutex::Mutex<T>
T must be Send for a Mutex to be Send because it is possible to acquire
the owned T from the Mutex via into_inner.
impl<T> Send for std::sync::poison::mutex::Mutex<T>
T must be Send for a Mutex to be Send because it is possible to acquire
the owned T from the Mutex via into_inner.
impl<T> Send for NonZero<T>where
T: ZeroablePrimitive + Send,
impl<T> Send for OffsetArc<T>
impl<T> Send for OnceLock<T>where
T: Send,
impl<T> Send for Out<'_, T>where
T: Send,
impl<T> Send for RChunksExactMut<'_, T>where
T: Send,
impl<T> Send for RChunksMut<'_, T>where
T: Send,
impl<T> Send for std::sync::mpmc::Receiver<T>where
T: Send,
impl<T> Send for std::sync::mpsc::Receiver<T>where
T: Send,
impl<T> Send for ReentrantLock<T>
impl<T> Send for RefCell<T>
impl<T> Send for std::sync::nonpoison::rwlock::RwLock<T>
impl<T> Send for std::sync::poison::rwlock::RwLock<T>
impl<T> Send for std::sync::mpmc::Sender<T>where
T: Send,
impl<T> Send for std::sync::mpsc::Sender<T>where
T: Send,
impl<T> Send for SerVec<T>where
T: Send,
impl<T> Send for SyncSender<T>where
T: Send,
impl<T> Send for ThinBox<T>
ThinBox<T> is Send if T is Send because the data is owned.