Struct SyncWrapper
#[repr(transparent)]
pub struct SyncWrapper<T>(/* private field */);
A mutual exclusion primitive that relies on static type information only
In some cases synchronization can be proven statically: whenever you hold an exclusive &mut
reference, the Rust type system ensures that no other part of the program can hold another
reference to the data. Therefore it is safe to access it even if the current thread obtained
this reference via a channel. Whenever this is the case, the overhead of allocating and locking
a Mutex can be avoided by using this static version.
One example where this is often applicable is Future, which requires an exclusive reference
for its poll method: While a given Future implementation may not be safe to access by
multiple threads concurrently, the executor can only run the Future on one thread at any
given time, making it Sync in practice as long as the implementation is Send. You can
therefore use the static mutex to prove that your data structure is Sync even though it
contains such a Future.
Example
use SyncWrapper;
use Future;
;
Implementations
impl<T> SyncWrapper<T>
const fn new(value: T) -> SelfCreates a new static mutex containing the given value.
Examples
use SyncWrapper; let mutex = new;fn get_mut(&mut self) -> &mut TAcquires a reference to the protected value.
This is safe because it requires an exclusive reference to the mutex. Therefore this method neither panics nor does it return an error. This is in contrast to
Mutex::get_mutwhich returns an error if another thread panicked while holding the lock. It is not recommended to send an exclusive reference to a potentially damaged value to another thread for further processing.Examples
use SyncWrapper; let mut mutex = new; let value = mutex.get_mut; *value = 0; assert_eq!;fn get_pin_mut(self: Pin<&mut Self>) -> Pin<&mut T>Acquires a pinned reference to the protected value.
See
Self::get_mutfor why this method is safe.Examples
use Future; use Pin; use ; use pin_project; use SyncWrapper; pin_project!fn into_inner(self) -> TConsumes this mutex, returning the underlying data.
This is safe because it requires ownership of the mutex, therefore this method will neither panic nor does it return an error. This is in contrast to
Mutex::into_innerwhich returns an error if another thread panicked while holding the lock. It is not recommended to send an exclusive reference to a potentially damaged value to another thread for further processing.Examples
use SyncWrapper; let mut mutex = new; assert_eq!;
Trait Implementations
impl<T> Debug for SyncWrapper<T>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T> From<T> for SyncWrapper<T>
fn from(value: T) -> Self
impl<T> Sync for SyncWrapper<T>
impl<T: Default> Default for SyncWrapper<T>
fn default() -> Self
Auto Trait Implementations
impl<T> Freeze for SyncWrapper<T>
where
T: Freeze,
impl<T> RefUnwindSafe for SyncWrapper<T>
where
T: RefUnwindSafe,
impl<T> Send for SyncWrapper<T>
where
T: Send,
impl<T> Unpin for SyncWrapper<T>
where
T: Unpin,
impl<T> UnsafeUnpin for SyncWrapper<T>
where
T: UnsafeUnpin,
impl<T> UnwindSafe for SyncWrapper<T>
where
T: UnwindSafe,
Blanket Implementations
impl<T> Any for SyncWrapper<T>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for SyncWrapper<T>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for SyncWrapper<T>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> From<T> for SyncWrapper<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> From<never> for SyncWrapper<T>
fn from(t: never) -> T
impl<T, U> Into<U> for SyncWrapper<T>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for SyncWrapper<T>
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for SyncWrapper<T>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>