Struct Thread

struct Thread { ... }

A handle to a thread.

Threads are represented via the Thread type, which you can get in one of two ways:

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.

Implementations

impl Thread

fn unpark(self: &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 park function and the unpark() method. These can be used as a more CPU-efficient implementation of a spinlock.

See the park documentation for more details.

Examples

use std::thread;
use std::time::Duration;
use std::sync::atomic::{AtomicBool, Ordering};

static QUEUED: AtomicBool = AtomicBool::new(false);

let parked_thread = thread::Builder::new()
    .spawn(|| {
        println!("Parking thread");
        QUEUED.store(true, Ordering::Release);
        thread::park();
        println!("Thread unparked");
    })
    .unwrap();

// Let some time pass for the thread to be spawned.
thread::sleep(Duration::from_millis(10));

// 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(Ordering::Acquire) {
    // Spinning is of course inefficient; in practice, this would more likely be
    // a dequeue where we have no work to do if there's nobody queued.
    std::hint::spin_loop();
}

println!("Unpark the thread");
parked_thread.thread().unpark();

parked_thread.join().unwrap();
fn id(self: &Self) -> ThreadId

Gets the thread's unique identifier.

Examples

use std::thread;

let other_thread = thread::spawn(|| {
    thread::current().id()
});

let other_thread_id = other_thread.join().unwrap();
assert!(thread::current().id() != other_thread_id);
fn name(self: &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 std::thread;

let builder = thread::Builder::new();

let handler = builder.spawn(|| {
    assert!(thread::current().name().is_none());
}).unwrap();

handler.join().unwrap();

Thread with a specified name:

use std::thread;

let builder = thread::Builder::new()
    .name("foo".into());

let handler = builder.spawn(|| {
    assert_eq!(thread::current().name(), Some("foo"))
}).unwrap();

handler.join().unwrap();
fn into_raw(self: Self) -> *const ()

Consumes the Thread, returning a raw pointer.

To avoid a memory leak the pointer must be converted back into a Thread using Thread::from_raw. The pointer is guaranteed to be aligned to at least 8 bytes.

Examples

#![feature(thread_raw)]

use std::thread::{self, Thread};

let thread = thread::current();
let id = thread.id();
let ptr = Thread::into_raw(thread);
unsafe {
    assert_eq!(Thread::from_raw(ptr).id(), id);
}
unsafe fn from_raw(ptr: *const ()) -> Thread

Constructs a Thread from 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 Thread is never accessed.

Creating a Thread from a pointer other than one returned from Thread::into_raw is undefined behavior.

Calling this function twice on the same raw pointer can lead to a double-free if both Thread instances are dropped.

impl Clone for Thread

fn clone(self: &Self) -> Thread

impl Debug for Thread

fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result

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

impl<T> Any for Thread

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for Thread

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for Thread

fn borrow_mut(self: &mut Self) -> &mut T

impl<T> CloneToUninit for Thread

unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)

impl<T> From for Thread

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for Thread

fn to_owned(self: &Self) -> T
fn clone_into(self: &Self, target: &mut T)

impl<T, U> Into for Thread

fn into(self: Self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom for Thread

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto for Thread

fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>