是否可以保证一个线程每隔一秒唤醒并运行一次?

Is it possible to guarantee a thread wakes up and runs every one second?

while (true) {
    sleep(seconds(1));
    log(get_current_time());
}

这个问题不特定于任何一种语言。

是否可以保证此线程记录日志条目的间隔恰好为一秒?据我了解,在睡眠 1 秒后,该线程将被唤醒并在内核中标记为 运行nable 但取决于哪些其他线程是 运行nable 以及它们的相对优先级(或者可能是其他必须完成的繁忙工作),内核可能不会将线程调度到 运行,直到一小段时间之后。这可能会导致日志条目相隔 1.1 秒。

可以在用户级代码中做些什么来减少这种差异吗?除了尽可能少的其他线程。

取决于你所说的“完全正确”是什么意思。没有时钟是“准确的”。 sleep(1) 只保证睡眠 至少 一秒钟。它可以睡得更久,但在现代 Linux 上,可能只长一点点。

如果你真正想要的是long-term平均迭代次数为每秒一次,那么你需要这样做(pseudo-code 因为我现在无法访问真正的计算机):

dueDate = get_current_time();
while (true) {
    sleepInterval = dueDate - get_current_time();
    if (sleepInterval > 0) {
        sleep(sleepInterval);
    }
    doWhateverNeedsToBeDone();
    dueDate += oneSecond;
}

这可以防止计时错误累积。 sleep() 调用可能不会在正确的时间唤醒,但下一个 dueDate 总是会增加 正好 一秒。

如果您的 get_current_time() 类函数和 sleep() 类函数都在细粒度上工作,这将有所帮助。 Linux 具有 return 以纳秒为单位的时钟,并且它能够休眠给定的纳秒数,但我忘记了这些函数的实际名称。您可以在 Google.

中轻松找到它们

如果使用常规 Linux 系统调用该技巧不能为您提供足够的准确性,那么您可能需要 运行 启用“real-time”版本的 Linux,并使用特权系统调用为您的进程启用 real-time 调度。