为什么 999µs 太短而 1000µs 恰到好处?

How is 999µs too short but 1000µs just right?

当我运行以下代码时,我得到 some output:

use std::thread::Thread;

static DELAY: i64 = 1000;

fn main() {
    Thread::spawn(move || {
        println!("some output");
    });

    std::io::timer::sleep(std::time::duration::Duration::microseconds(DELAY));
}

但是如果我将 DELAY 设置为 999,我什么也得不到。我认为 999 和 1000 足够接近,不会造成这样的差异,这意味着这里一定有其他事情发生。我也尝试过 Duration::nanoseconds(999_999 和 1_000_000),我看到了相同的行为。

我的平台是 Linux,我几乎总是可以重现此行为:使用 999 导致 some output 的运行次数不到 1%。


作为旁注,我知道这种方法

sleep 函数以 1 毫秒为增量休眠,如果毫秒数小于 1,则根本不休眠。这是相关的 excerpt from the code:

pub fn sleep(&mut self, duration: Duration) {
    // Short-circuit the timer backend for 0 duration
    let ms = in_ms_u64(duration);
    if ms == 0 { return }
    self.inner.sleep(ms);
}

在您的代码中,999 微秒使其根本没有休眠,并且主线程在派生线程可以打印其输出之前结束。 1000 微秒,即 1 毫秒,主线程休眠,让衍生线程有机会 运行.

最有可能的是你将你的内核配置为具有 1000Hz 的 TICK(每毫秒一次时钟中断)也许你可以改进它重新编译更细粒度的时钟或无滴答内核并重新编译你的内核以允许更精细时钟分辨率。 1000Hz 时钟节拍现在是 pc 上 Linux 内核 运行 的标准(以及大多数 ARM 和嵌入式 Linux)。

这不是新手问题,因此您可能需要寻求本地帮助来重新配置和重新编译您的内核以应对更多时间分辨率。