Struct Thread
pub struct Thread { pub(in ::thread::thread) inner: Pin<Arc<Inner, System>> }
A handle to a thread.
Threads are represented via the Thread type, which you can get in one of
two ways:
- By spawning a new thread, e.g., using the
thread::spawnfunction, and callingthreadon theJoinHandle. - By requesting the current thread, using the
thread::currentfunction.
The thread::current function is available even for threads not spawned
by the APIs of this module.
There is usually no need to create a Thread struct yourself, one
should instead use a function like spawn to create new threads, see the
docs of Builder and spawn for more details.
Fields
inner: Pin<Arc<Inner, System>>
Implementations
impl Thread
fn new(id: ThreadId, name: Option<String>) -> Threadfn new_current(id: ThreadId) -> ThreadCreates a handle for the calling thread, recording its OS id.
idmust be theThreadIdof the calling thread.Takes no name because passing one into
Thread::newallocates with the global allocator, whichthread::currentis documented never to use.fn set_os_id_to_current(&self)Records the calling thread's OS id, as reported by
imp::current_os_id, in this handle.May only be called from the thread to which this handle belongs. A spawned thread does this itself once it starts running, since its handle already exists by then.
imp::current_os_idmust not allocate with the global allocator or callthread::current.unsafe fn park(&self)Like the public
park, but callable on any handle. This is used to allow parking in TLS destructors.Safety
May only be called from the thread to which this handle belongs.
unsafe fn park_timeout(&self, dur: Duration)Like the public
park_timeout, but callable on any handle. This is used to allow parking in TLS destructors.Safety
May only be called from the thread to which this handle belongs.
fn unpark(&self)Atomically makes the handle's token available if it is not already.
Every thread is equipped with some basic low-level blocking support, via the
parkfunction and theunpark()method. These can be used as a more CPU-efficient implementation of a spinlock.See the park documentation for more details.
Examples
use thread; use Duration; use ; static QUEUED: AtomicBool = new; let parked_thread = new .spawn .unwrap; // Let some time pass for the thread to be spawned. sleep; // Wait until the other thread is queued. // This is crucial! It guarantees that the `unpark` below is not consumed // by some other code in the parked thread (e.g. inside `println!`). while !QUEUED.load println!; parked_thread.thread.unpark; parked_thread.join.unwrap;fn id(&self) -> ThreadIdGets the thread's unique identifier.
Examples
use thread; let other_thread = spawn; let other_thread_id = other_thread.join.unwrap; assert!;fn os_id(&self) -> Option<u64>Gets the id the operating system gave this thread, if it has one that can be read.
This is the id that shows up in tools like
psandtop, debuggers and crash logs, unlikeThreadId, which has no guaranteed relationship to it. On a platform with no OS-visible thread id, such as SGX, the value may be some other per-thread value (there, the thread's address), which such tools will not recognize.Nonemeans no id could be recorded: the thread has not started running yet, or the platform has no way to read one.The operating system may reuse the id of a thread that has exited, and a
Threadhandle can outlive the thread it refers to. After afork, the id recorded in the child process still refers to the parent's thread; it is not re-read. Use the id only where a reused or stale id is harmless, such as logging.Examples
use thread; let spawned = spawn.join.unwrap; if spawned.is_somefn name(&self) -> Option<&str>Gets the thread's name.
For more information about named threads, see this module-level documentation.
Examples
Threads by default have no name specified:
use thread; let builder = new; let handler = builder.spawn.unwrap; handler.join.unwrap;Thread with a specified name:
use thread; let builder = new .name; let handler = builder.spawn.unwrap; handler.join.unwrap;fn into_raw(self) -> *const ()Consumes the
Thread, returning a raw pointer.To avoid a memory leak the pointer must be converted back into a
ThreadusingThread::from_raw. The pointer is guaranteed to be aligned to at least 8 bytes.Examples
use ; let thread = current; let id = thread.id; let ptr = into_raw; unsafeunsafe fn from_raw(ptr: *const ()) -> ThreadConstructs a
Threadfrom a raw pointer.The raw pointer must have been previously returned by a call to
Thread::into_raw.Safety
This function is unsafe because improper use may lead to memory unsafety, even if the returned
Threadis never accessed.Creating a
Threadfrom a pointer other than one returned fromThread::into_rawis undefined behavior.Calling this function twice on the same raw pointer can lead to a double-free if both
Threadinstances are dropped.fn cname(&self) -> Option<&CStr>
Trait Implementations
impl Clone for Thread
fn clone(&self) -> Self
impl Debug for Thread
fn fmt(&self, f: &mut Formatter<'_>) -> Result
Auto Trait Implementations
impl Freeze for Thread
impl RefUnwindSafe for Thread
impl Send for Thread
impl Sync for Thread
impl Unpin for Thread
impl UnsafeUnpin for Thread
impl UnwindSafe for Thread
Blanket Implementations
impl<T> Any for Thread
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Thread
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Thread
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Thread
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for Thread
fn from(t: T) -> TReturns the argument unchanged.
impl<T> SizeHint for Thread
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for Thread
impl<T> ToOwned for Thread
where
T: Clone,
type Owned = T;fn to_owned(&self) -> Tfn clone_into(&self, target: &mut T)
impl<T, U> Into<U> for Thread
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 Thread
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for Thread
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>