pub struct Thread { /* private fields */ }Expand description
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.
Implementations§
Source§impl Thread
impl Thread
1.0.0 · Sourcepub fn unpark(&self)
pub 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 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();Sourcepub fn os_id(&self) -> Option<u64>
🔬This is a nightly-only experimental API. (thread_os_id #160215)
pub fn os_id(&self) -> Option<u64>
thread_os_id #160215)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 ps and top, debuggers and
crash logs, unlike ThreadId, 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. None means 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
Thread handle can outlive the thread it refers to. After a fork, 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
1.0.0 · Sourcepub fn name(&self) -> Option<&str>
pub fn 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 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:
Sourcepub fn into_raw(self) -> *const ()
🔬This is a nightly-only experimental API. (thread_raw #97523)
pub fn into_raw(self) -> *const ()
thread_raw #97523)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
Sourcepub unsafe fn from_raw(ptr: *const ()) -> Thread
🔬This is a nightly-only experimental API. (thread_raw #97523)
pub unsafe fn from_raw(ptr: *const ()) -> Thread
thread_raw #97523)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.