当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust park用法及代码示例


本文简要介绍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 有点像一个自旋锁,可以使用 parkunpark 锁定和解锁。

请注意,被解除阻塞并不意味着与解除该线程的人有任何同步,它也可能是虚假的。例如,让 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-lang.org大神的英文原创作品 Function std::thread::park。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。