Функция park
Функция park блокирует текущий поток, переводя его в состояние ожидания. Поток не будет потреблять ресурсы процессора до тех пор, пока другой поток не вызовет функцию unpark, передав в неё дескриптор заблокированного потока. Функция не принимает параметров и возвращает тип . Блокировка может быть снята также при возникновении ложного пробуждения, поэтому в реальных программах park обычно используют в цикле с проверкой условия.
Синтаксис
thread::park()
Пример
Давайте создадим поток, который немедленно блокирует себя с помощью park, а главный поток разблокирует его через unpark:
use std::thread;
use std::time::Duration;
fn main()
{
let handle = thread::spawn(|| {
println!("Thread is parked");
thread::park();
println!("Thread is unparked");
});
thread::sleep(Duration::from_millis(100));
handle.thread().unpark();
handle.join().unwrap();
}
Результат выполнения кода:
Thread is parked
Thread is unparked
Пример
Давайте покажем, что вызов unpark до park не приводит к блокировке, так как разрешение на пробуждение сохраняется:
use std::thread;
fn main()
{
let handle = thread::spawn(|| {
thread::park();
println!("Thread continues after park");
});
handle.thread().unpark();
handle.join().unwrap();
}
Результат выполнения кода:
Thread continues after park