pub use std::thread::{
current, panicking, park, park_timeout, sleep, spawn, yield_now, Builder, JoinHandle, Thread,
ThreadId,
};
pub use std::time::Duration;
pub fn spawn_thread<F, T>(f: F) -> JoinHandle<T>
where
F: FnOnce() -> T + Send + 'static,
T: Send + 'static,
{
spawn(f)
}
pub fn sleep_seconds(secs: u64) {
sleep(Duration::from_secs(secs))
}
pub fn sleep_millis(millis: u64) {
sleep(Duration::from_millis(millis))
}
pub fn sleep_micros(micros: u64) {
sleep(Duration::from_micros(micros))
}
pub fn current_thread() -> Thread {
current()
}
pub fn current_id() -> ThreadId {
current().id()
}
pub fn current_name() -> Option<String> {
current().name().map(String::from)
}
pub fn yield_thread() {
yield_now()
}
pub fn is_panicking() -> bool {
panicking()
}
pub fn park_thread() {
park()
}
pub fn park_thread_timeout(duration: Duration) {
park_timeout(duration)
}
pub fn join<T>(handle: JoinHandle<T>) -> T {
handle.join().expect("Thread panicked")
}
pub fn try_join<T>(handle: JoinHandle<T>) -> Result<T, String> {
handle.join().map_err(|_| "Thread panicked".to_string())
}
pub fn available_parallelism() -> usize {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1)
}
pub fn scope<'env, F, R>(f: F) -> R
where
F: for<'scope> FnOnce(&'scope std::thread::Scope<'scope, 'env>) -> R,
{
std::thread::scope(f)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_spawn_and_join() {
let handle = spawn_thread(|| 42);
assert_eq!(join(handle), 42);
}
#[test]
fn test_sleep() {
let start = std::time::Instant::now();
sleep_millis(100);
let elapsed = start.elapsed();
assert!(elapsed.as_millis() >= 100);
}
#[test]
fn test_current_thread() {
let thread = current_thread();
let id = current_id();
assert_eq!(thread.id(), id);
}
#[test]
fn test_available_parallelism() {
let n = available_parallelism();
assert!(n >= 1);
}
#[test]
fn test_scoped_threads() {
let mut data = [1, 2, 3, 4];
scope(|s| {
s.spawn(|| {
data[0] = 10;
});
});
assert_eq!(data[0], 10);
}
}