为什么要使用usleep而不是sleep?

8
我正在阅读一份应用程序的代码,其中引起了我的注意。代码是:usleep(6*1000*1000)。我理解他们之所以使用这种格式是为了可读性。
我认为sleepusleep都使用nanosleep函数,所以我的问题是:为什么不使用能够完全相同(即睡眠6秒)的sleep(6)呢?当我们使用usleep时,我们是否可以获得更好的性能?usleep是否更加"通用"?

3
你应该询问作者。 - too honest for this site
1
可能是感知准确度的问题。微睡眠必须比普通的一秒分辨率睡眠具有更好的精度。 - Jonathan Leffler
2
sleep 的 man 手册提到它可能使用 SIGALRM 实现,因此您可能无法将对 sleep() 的调用与 alarm() 混合使用。 - Chris Turner
2
你说的是哪个 usleep 实现?POSIX 仅保证其对小于一百万的值有效。 - Sander De Dycker
1
在一些非常丑陋的历史系统中,sleep 是通过 alarm 实现的,因此会干扰对 SIGALRMalarm 的其他使用。也许作者想要避免这种情况。POSIX 仍然(作为一个错误)允许这样的实现,但它与支持多线程的实现不兼容,而 POSIX 也要求支持多线程,因此应将其视为历史上不再相关的无意义内容。 - R.. GitHub STOP HELPING ICE
显示剩余2条评论
2个回答

11
我认为 sleep 和 usleep 都使用 nanosleep 函数,但这并非在 C 和 POSIX 标准中有任何理由支持的假设。
那么我的问题是:为什么不使用睡眠(6),它完全可以做到同样的事情(即睡眠 6 秒)?当我们使用 usleep 时,是否会提高性能?usleep 更“通用”吗?
sleep() 函数起源于 AT&T Unix 第 7 版。usleep() 函数起源于 BSD 4.3。虽然 POSIX 标准化了两者之间的混合功能,但曾经只有两者之一可用,取决于您使用的 Unix 版本。
现在,usleep() 已经过时,并且已从 POSIX 中删除。它仍然得到广泛支持,但新代码应改用 nanosleep() (或 sleep())。

睡眠从1秒开始,可以持续数年。但是只能以整秒为单位增加。usleep仅适用于亚秒级别的睡眠,而且在大多数系统上,它会拒绝任何超过1.0秒的请求。nanosleep需要一个具有两个插槽的结构体,即秒和亚秒,因此对于长于一秒的中期定时更有效。 - DragonLord

2

sleep函数的参数是秒数,usleep函数的参数是微秒数。除此之外,我认为它们是完全一样的。

sleep($n) 相当于 usleep($n * 1000000)。 usleep(25000) 只会休眠0.025秒。


睡眠从1秒开始,可以持续数年。usleep仅用于亚秒级别的睡眠,在大多数系统上,它会拒绝任何超过1.0秒的请求。 - DragonLord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接