【发布时间】:2020-08-31 18:23:12
【问题描述】:
根据 linux 程序员手册,其中说: “sleep() 使调用线程休眠,直到秒秒过去或没有被忽略的信号到达。”
我认为一个线程不会在睡眠时间到期后立即恢复执行。它可能醒得早或晚,还没有确定。对吧?
【问题讨论】:
-
我认为它不会早起。它可能会晚一点醒来,具体取决于它计划再次运行的时间。
-
@Haris 我从 ubuntu 手册中找到了这个材料。 “sleep() 使调用线程休眠,直到秒秒过去或没有被忽略的信号到达。”所以,我认为它可能会被信号提前唤醒。
-
@sunshilong369 你是对的。 sleep() 调用可能会被信号中断。但这(以及您引用的文档)适用于 POSIX/Linux 系统。我不知道睡眠和信号在 Windows 上是如何工作的。此外,当然,您的线程可能会休眠更长时间,具体取决于它何时被安排执行,但它不应该有太大的区别。如果你想在有信号的情况下恢复睡眠,你可以使用nanosleep() - 同样,文档适用于 POSIX
-
如果没有被信号“骚扰”,
sleep将保证其参数的最小数量(即,如果您指定 5,则等待将至少 5秒,并且由于调度延迟,一毫秒左右)。 -
@sunshilong369 由于调度策略和资源的可用性,任何等待/阻止等待某些资源的函数调用都可能需要无限的时间才能返回,如果这是您所要求的。您的程序不能强制内核在准确的时间(例如 3 秒)从睡眠状态恢复。但通常,您的执行将在 3 +
秒后恢复。