本文简要介绍rust语言中 Function std::thread::park
的用法。
用法
pub fn park()
阻塞,除非或直到当前线程的令牌可用。
对park
的调用并不能保证线程将永远处于停放状态,调用者应该为这种可能性做好准备。
停放和取消停放
通过 thread::park
函数和 thread::Thread::unpark
方法,每个线程都配备了一些基本的低级阻塞支持。 park
阻塞当前线程,然后可以通过在阻塞线程的句柄上调用 unpark
方法从另一个线程恢复。
从概念上讲,每个 Thread
句柄都有一个关联的标记,最初不存在:
-
std::thread::park函数会阻塞当前线程,除非或直到令牌可用于其线程句柄,此时它会自动消耗该令牌。也有可能回归虚假地,而不消耗令牌。std::thread::park_timeout执行相同的操作,但允许指定阻塞线程的最长时间。
-
Thread
上的unpark
方法自动使令牌可用(如果它还没有)。因为令牌最初不存在,所以unpark
后跟park
将导致第二个调用立即返回。
换句话说,每个 Thread
有点像一个自旋锁,可以使用 park
和 unpark
锁定和解锁。
请注意,被解除阻塞并不意味着与解除该线程的人有任何同步,它也可能是虚假的。例如,让 park
和 unpark
立即返回而不做任何事情是一种有效但低效的实现。
API 通常用于获取当前线程的句柄,将该句柄放在共享数据结构中,以便其他线程可以找到它,然后在循环中执行 park
。当满足某些所需条件时,另一个线程在句柄上调用 unpark
。
这种设计的动机是双重的:
-
它避免了在构建新的同步原语时分配互斥锁和条件变量的需要;线程已经提供了基本的阻塞/信号。
-
它可以在许多平台上非常有效地实现。
例子
use std::thread;
use std::sync::{Arc, atomic::{Ordering, AtomicBool}};
use std::time::Duration;
let flag = Arc::new(AtomicBool::new(false));
let flag2 = Arc::clone(&flag);
let parked_thread = thread::spawn(move || {
// We want to wait until the flag is set. We *could* just spin, but using
// park/unpark is more efficient.
while !flag2.load(Ordering::Acquire) {
println!("Parking thread");
thread::park();
// We *could* get here spuriously, i.e., way before the 10ms below are over!
// But that is no problem, we are in a loop until the flag is set anyway.
println!("Thread unparked");
}
println!("Flag received");
});
// Let some time pass for the thread to be spawned.
thread::sleep(Duration::from_millis(10));
// Set the flag, and let the thread wake up.
// There is no race condition here, if `unpark`
// happens first, `park` will return immediately.
// Hence there is no risk of a deadlock.
flag.store(true, Ordering::Release);
println!("Unpark the thread");
parked_thread.thread().unpark();
parked_thread.join().unwrap();
相关用法
- Rust park_timeout用法及代码示例
- Rust panicking用法及代码示例
- Rust panic用法及代码示例
- Rust pointer.offset_from用法及代码示例
- Rust pointer.is_null用法及代码示例
- Rust pointer.add用法及代码示例
- Rust pointer.get_unchecked用法及代码示例
- Rust pointer.align_offset用法及代码示例
- Rust pointer.wrapping_add用法及代码示例
- Rust pointer.wrapping_offset用法及代码示例
- Rust pointer.wrapping_sub用法及代码示例
- Rust poll_fn用法及代码示例
- Rust pointer.as_uninit_ref用法及代码示例
- Rust pointer.len用法及代码示例
- Rust pointer.get_unchecked_mut用法及代码示例
- Rust pointer.sub用法及代码示例
- Rust pointer.set_ptr_value用法及代码示例
- Rust println用法及代码示例
- Rust pointer.as_ptr用法及代码示例
- Rust pointer.as_mut_ptr用法及代码示例
- Rust pending用法及代码示例
- Rust pointer用法及代码示例
- Rust print用法及代码示例
- Rust pointer.offset用法及代码示例
- Rust pointer.as_mut用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::thread::park。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。