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.
Implementors§
impl !Send for std::env::Args
impl !Send for ArgsOs
impl !Send for Arguments<'_>
impl !Send for std::sys::args::common::Args
target_family=unix and neither target_os=espidf nor target_os=vita, or target_family=windows, or HermitCore, or target_os=motor, or target_os=uefi, or WASI, or target_os=xous only.impl !Send for Env
target_family=unix, or HermitCore, or target_os=motor, or Fortanix and SGX, or target_os=solid_asp3, or target_os=uefi, or WASI, or target_os=xous only.impl !Send for LocalWaker
impl Send for std::backtrace_rs::backtrace::libunwind::Frame
impl Send for core::ffi::c_str::Bytes<'_>
impl Send for TypeId
impl Send for ResumeTy
impl Send for Repr
target_os=uefi only.impl Send for BorrowedHandle<'_>
impl Send for HandleOrInvalid
impl Send for HandleOrNull
impl Send for OwnedHandle
impl Send for Location<'_>
impl Send for std::string::Drain<'_>
impl Send for Dir
impl Send for LookupHost
impl Send for CStringArray
impl Send for std::sys::thread::unix::Thread
impl Send for std::task::Waker
impl<'a> Send for std::io::IoSlice<'a>
impl<'a> Send for std::io::IoSliceMut<'a>
impl<Dyn> Send for DynMetadata<Dyn>where
Dyn: ?Sized,
impl<F> Send for DlsymWeak<F>
impl<T> !Send for *const Twhere
T: ?Sized,
impl<T> !Send for *mut Twhere
T: ?Sized,
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 &T
impl<T> Send for ThinBox<T>
ThinBox<T> is Send if T is Send because the data is owned.
impl<T> Send for Cell<T>
impl<T> Send for RefCell<T>
impl<T> Send for std::collections::linked_list::Iter<'_, T>where
T: Sync,
impl<T> Send for std::collections::linked_list::IterMut<'_, T>where
T: Send,
impl<T> Send for NonZero<T>where
T: ZeroablePrimitive + Send,
impl<T> Send for Unique<T>
Unique pointers are Send if T is Send because the data they
reference is unaliased. Note that this aliasing invariant is
unenforced by the type system; the abstraction using the
Unique must enforce it.
impl<T> Send for ChunksExactMut<'_, T>where
T: Send,
impl<T> Send for ChunksMut<'_, T>where
T: Send,
impl<T> Send for std::slice::Iter<'_, T>where
T: Sync,
impl<T> Send for std::slice::IterMut<'_, 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 AtomicPtr<T>
target_has_atomic_load_store=ptr only.impl<T> Send for JoinHandle<T>
impl<T, A> !Send for Rc<T, A>
impl<T, A> !Send for UniqueRc<T, A>
impl<T, A> !Send for std::rc::Weak<T, A>
impl<T, A> Send for std::collections::linked_list::Cursor<'_, T, A>
impl<T, A> Send for std::collections::linked_list::CursorMut<'_, T, A>
impl<T, A> Send for LinkedList<T, A>
impl<T, A> Send for std::collections::vec_deque::Drain<'_, T, A>
impl<T, A> Send for Arc<T, A>
impl<T, A> Send for UniqueArc<T, A>
impl<T, A> Send for std::sync::Weak<T, A>
impl<T, A> Send for std::vec::Drain<'_, T, A>
impl<T, A> Send for std::vec::IntoIter<T, A>
impl<T: Send + ?Sized> Send for ReentrantLock<T>
impl<T: Send> Send for std::sync::mpmc::Receiver<T>
impl<T: Send> Send for std::sync::mpmc::Sender<T>
impl<T: Send> Send for std::sync::mpsc::Receiver<T>
impl<T: Send> Send for std::sync::mpsc::Sender<T>
impl<T: Send> Send for SyncSender<T>
impl<T: Send> Send for OnceLock<T>
impl<T: Send> Send for OnceBox<T>
impl<T: ?Sized + Send> 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: ?Sized + Send> Send for std::sync::nonpoison::rwlock::RwLock<T>
impl<T: ?Sized + Send> Send for std::sync::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: ?Sized + Send> Send for std::sync::RwLock<T>
impl<T: ?Sized> !Send for std::sync::nonpoison::mutex::MappedMutexGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::nonpoison::mutex::MutexGuard<'_, T>
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: ?Sized> !Send for std::sync::nonpoison::rwlock::MappedRwLockReadGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::nonpoison::rwlock::MappedRwLockWriteGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::nonpoison::rwlock::RwLockReadGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::nonpoison::rwlock::RwLockWriteGuard<'_, T>
impl<T: ?Sized> !Send for ReentrantLockGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::MappedMutexGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::MappedRwLockReadGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::MappedRwLockWriteGuard<'_, T>
impl<T: ?Sized> !Send for std::sync::MutexGuard<'_, T>
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.