是否可以保证一个线程每隔一秒唤醒并运行一次?
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 调度。
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 调度。