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 Arguments<'_>
impl !Send for LocalWaker
impl !Send for Args
impl !Send for ArgsOs
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 topsoil_core::runtime::std::sync::nonpoison::MappedMutexGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::nonpoison::MappedRwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::nonpoison::MappedRwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::nonpoison::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 topsoil_core::runtime::std::sync::nonpoison::RwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::nonpoison::RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::MappedMutexGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::MappedRwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::MappedRwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::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 ReentrantLockGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::RwLockReadGuard<'_, T>where
T: ?Sized,
impl<T> !Send for topsoil_core::runtime::std::sync::RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T, A> !Send for Rc<T, A>
impl<T, A> !Send for UniqueRc<T, A>
impl<T, A> !Send for topsoil_core::runtime::std::rc::Weak<T, A>
impl Send for TypeId
impl Send for alloc::string::Drain<'_>
impl Send for core::ffi::c_str::Bytes<'_>
impl Send for Location<'_>
impl Send for Waker
impl Send for bytes::bytes::Bytes
impl Send for BytesMut
impl Send for AtomicWaker
impl<'a> Send for IoSlice<'a>
impl<'a> Send for IoSliceMut<'a>
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> Send for smallvec::Drain<'a, T>
impl<'a, T, const CAP: usize> Send for arrayvec::arrayvec::Drain<'a, T, CAP>where
T: Send,
impl<A> Send for SmallVec<A>
impl<C> Send for Secp256k1<C>where
C: Context,
impl<Dyn> Send for DynMetadata<Dyn>where
Dyn: ?Sized,
impl<Fut> Send for futures_util::stream::futures_unordered::iter::IntoIter<Fut>
impl<Fut> Send for IterPinMut<'_, Fut>where
Fut: Send,
impl<Fut> Send for IterPinRef<'_, Fut>where
Fut: Send,
impl<Fut> Send for FuturesUnordered<Fut>where
Fut: Send,
impl<K, V> Send for hashbrown::map::IterMut<'_, K, V>
impl<K, V> Send for hashbrown::map::IterMut<'_, K, V>
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 hashbrown::map::RawOccupiedEntryMut<'_, K, V, S, A>
impl<K, V, S, A> Send for hashbrown::raw_entry::RawOccupiedEntryMut<'_, K, V, S, A>
impl<R, G> Send for RawReentrantMutex<R, G>
impl<R, G, T> Send for ReentrantMutex<R, G, T>
impl<R, T> Send for lock_api::mutex::Mutex<R, T>
impl<R, T> Send for lock_api::rwlock::RwLock<R, T>
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 NonZero<T>where
T: ZeroablePrimitive + Send,
impl<T> Send for ChunksExactMut<'_, T>where
T: Send,
impl<T> Send for ChunksMut<'_, T>where
T: Send,
impl<T> Send for topsoil_core::runtime::std::slice::Iter<'_, T>where
T: Sync,
impl<T> Send for topsoil_core::runtime::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 Atomic<T>where
T: AtomicPrimitive,
impl<T> Send for topsoil_core::runtime::std::sync::mpmc::Receiver<T>where
T: Send,
impl<T> Send for topsoil_core::runtime::std::sync::mpmc::Sender<T>where
T: Send,
impl<T> Send for topsoil_core::runtime::std::sync::mpsc::Receiver<T>where
T: Send,
impl<T> Send for topsoil_core::runtime::std::sync::mpsc::Sender<T>where
T: Send,
impl<T> Send for SyncSender<T>where
T: Send,
impl<T> Send for topsoil_core::runtime::std::sync::nonpoison::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 topsoil_core::runtime::std::sync::nonpoison::RwLock<T>
impl<T> Send for topsoil_core::runtime::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.