6

当我运行以下代码时,我得到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% 的运行。


作为旁注,我知道这种方法是错误的

4

2 回答 2

28

sleep函数以 1 毫秒为增量休眠,如果毫秒数小于 1,则它根本不休眠。以下是代码的相关摘录

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 毫秒)内,主线程进入休眠状态,从而使生成的线程有机会运行。

于 2015-01-06T17:42:31.767 回答
-3

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

这不是一个新手问题,因此也许您必须寻求本地帮助来重新配置和重新编译您的内核以应对更多时间分辨率。

于 2015-01-08T13:43:48.190 回答