Struct Parker
struct Parker { ... }
A thread parking primitive.
Conceptually, each Parker has an associated token which is initially not present:
-
The
parkmethod blocks the current thread unless or until the token is available, at which point it automatically consumes the token. -
The
park_timeoutandpark_deadlinemethods work the same aspark, but block for a specified maximum time. -
The
unparkmethod atomically makes the token available if it wasn't already. Because the token is initially absent,unparkfollowed byparkwill result in the second call returning immediately.
In other words, each Parker acts a bit like a spinlock that can be locked and unlocked using
park and unpark.
Examples
use thread;
use Duration;
use Parker;
let p = new;
let u = p.unparker.clone;
// Make the token available.
u.unpark;
// Wakes up immediately and consumes the token.
p.park;
spawn;
// Wakes up when `u.unpark()` provides the token.
p.park;
# sleep; // wait for background threads closed: https://github.com/rust-lang/miri/issues/1371
Implementations
impl Parker
fn new() -> ParkerCreates a new
Parker.Examples
use Parker; let p = new;fn park(self: &Self)Blocks the current thread until the token is made available.
Examples
use Parker; let p = new; let u = p.unparker.clone; // Make the token available. u.unpark; // Wakes up immediately and consumes the token. p.park;fn park_timeout(self: &Self, timeout: Duration)Blocks the current thread until the token is made available, but only for a limited time.
Examples
use Duration; use Parker; let p = new; // Waits for the token to become available, but will not wait longer than 500 ms. p.park_timeout;fn park_deadline(self: &Self, deadline: Instant)Blocks the current thread until the token is made available, or until a certain deadline.
Examples
use ; use Parker; let p = new; let deadline = now + from_millis; // Waits for the token to become available, but will not wait longer than 500 ms. p.park_deadline;fn unparker(self: &Self) -> &UnparkerReturns a reference to an associated
Unparker.The returned
Unparkerdoesn't have to be used by reference - it can also be cloned.Examples
use Parker; let p = new; let u = p.unparker.clone; // Make the token available. u.unpark; // Wakes up immediately and consumes the token. p.park;fn into_raw(this: Parker) -> *const ()Converts a
Parkerinto a raw pointer.Examples
use Parker; let p = new; let raw = into_raw; # let _ = unsafe ;unsafe fn from_raw(ptr: *const ()) -> ParkerConverts a raw pointer into a
Parker.Safety
This method is safe to use only with pointers returned by
Parker::into_raw.Examples
use Parker; let p = new; let raw = into_raw; let p = unsafe ;
impl Debug for Parker
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Default for Parker
fn default() -> Self
impl Freeze for Parker
impl RefUnwindSafe for Parker
impl Send for Parker
impl Sync for Parker
impl Unpin for Parker
impl UnsafeUnpin for Parker
impl UnwindSafe for Parker
impl<T> Any for Parker
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Parker
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Parker
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for Parker
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for Parker
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Parker
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Parker
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>