gpt4 book ai didi

c++ - `std::this_thread::sleep_for()` 是否有任何特定于平台的限制?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:43 29 4
gpt4 key购买 nike

在使用 std::this_thread::sleep_for() 毫秒及以上时,是否需要考虑任何已知的可移植性问题?

在我正在进行的项目中,我希望使用 Microsoft 的 Sleep()naonsleep()usleep,具体取决于特定平台上可用的内容。其中一些具有明显的限制,例如在某些平台上不支持 1000 毫秒或更多的延迟。

std::this_thread::sleep_for() 是否也有这样的怪癖?

最佳答案

Maximum sleep duration: std::this_thread::sleep_for() 这里没有问题。你想睡多久就睡多久。

精度:std::this_thread::sleep_for() 与您提到的所有其他 sleep 函数也有同样的问题:可能不会!请参阅下面的更新!

任何 sleep 函数都会遇到怪癖,即当您的任务实际恢复时,它完全取决于操作系统中的调度程序。您的 sleep 时间通常会在您的抢占式多任务调度程序的最小时间片附近有所混叠。

更糟糕的是,这个时间片在所有操作系统上并不总是恒定的。

在 Linux 上,您通常有 10 毫秒的时间片, sleep 少于 10 毫秒可能导致 sleep 0 毫秒。休眠 10 毫秒可能导致休眠 大约 10 毫秒或更长时间,可能但不一定与时间片大小对齐。

简而言之:您不能完全依赖任何 sleep 函数,包括 std::this_thread::sleep_for()

还有一类休眠函数是忙等待。这通常在等待时间明显短于调度时间片(比如 2 us)时使用。但当然,即使这样也可能非常不准确,因为即使在几乎空闲的系统上,您的任务也可能被抢占,然后您可以在 2 us sleep 时间上增加 10 ms。

在多任务操作系统上你没有机会:你不能精确地 sleep 。 sleep 函数有错误,甚至有系统错误,所以在实践中 sleep 100 次 10 毫秒可能会 sleep 0 到 2 秒之间的任何东西。

如果您有长期时间要求,唯一的机会就是不断查询挂钟时间。

更新:Linux 和 macOS 上的基准测试:

至少在 Linux 和 macOS 上,std::this_thread::sleep_for() 的毫秒分辨率非常精确,因此不会受到我上面描述的所有伪像的影响:

Linux 基准测试:每次 sleep 被重复调用,总持续时间为一秒,并给出实际平均 sleep 时间(例如,平均超过 200 次 sleep 调用(5 毫秒)):

std::this_thread::sleep( 1 ms) slept really 1.13915 ms
std::this_thread::sleep( 2 ms) slept really 2.15215 ms
std::this_thread::sleep( 3 ms) slept really 3.14976 ms
std::this_thread::sleep( 4 ms) slept really 4.15059 ms
std::this_thread::sleep( 5 ms) slept really 5.15062 ms
std::this_thread::sleep( 6 ms) slept really 6.15008 ms
std::this_thread::sleep( 7 ms) slept really 7.14988 ms
std::this_thread::sleep( 8 ms) slept really 8.14979 ms
std::this_thread::sleep( 9 ms) slept really 9.15044 ms
std::this_thread::sleep(10 ms) slept really 10.1504 ms
std::this_thread::sleep(11 ms) slept really 11.1511 ms
std::this_thread::sleep(12 ms) slept really 12.1505 ms
std::this_thread::sleep(13 ms) slept really 13.1504 ms
std::this_thread::sleep(14 ms) slept really 14.1501 ms
std::this_thread::sleep(15 ms) slept really 15.1503 ms
std::this_thread::sleep(16 ms) slept really 16.1499 ms
std::this_thread::sleep(17 ms) slept really 17.1505 ms
std::this_thread::sleep(18 ms) slept really 18.1505 ms
std::this_thread::sleep(19 ms) slept really 19.1504 ms
std::this_thread::sleep(20 ms) slept really 20.1505 ms

同样适用于 macOS:

std::this_thread::sleep( 1 ms) slept really 1.27451 ms
std::this_thread::sleep( 2 ms) slept really 2.45646 ms
std::this_thread::sleep( 3 ms) slept really 3.61991 ms
std::this_thread::sleep( 4 ms) slept really 4.77443 ms
std::this_thread::sleep( 5 ms) slept really 5.7994 ms
std::this_thread::sleep( 6 ms) slept really 7.03769 ms
std::this_thread::sleep( 7 ms) slept really 8.13089 ms
std::this_thread::sleep( 8 ms) slept really 9.13276 ms
std::this_thread::sleep( 9 ms) slept really 10.441 ms
std::this_thread::sleep(10 ms) slept really 11.5895 ms
std::this_thread::sleep(11 ms) slept really 12.77 ms
std::this_thread::sleep(12 ms) slept really 13.8207 ms
std::this_thread::sleep(13 ms) slept really 14.9366 ms
std::this_thread::sleep(14 ms) slept really 16.4569 ms
std::this_thread::sleep(15 ms) slept really 17.27 ms
std::this_thread::sleep(16 ms) slept really 18.2013 ms
std::this_thread::sleep(17 ms) slept really 19.6347 ms
std::this_thread::sleep(18 ms) slept really 20.7785 ms
std::this_thread::sleep(19 ms) slept really 22.9571 ms
std::this_thread::sleep(20 ms) slept really 23.2532 ms

两次运行均在空闲系统上进行。有趣:在 Linux 上,数字在加载的系统上变得更加精确(是的,在屏幕 session 中)。调度神器!但是小的! :-)

这是针对 Linux 上的 usleep():也非常精确。我不再相信我上面写的:

usleep( 1 ms) slept really  1.148 ms
usleep( 2 ms) slept really 2.152 ms
usleep( 3 ms) slept really 3.151 ms
usleep( 4 ms) slept really 4.151 ms
usleep( 5 ms) slept really 5.149 ms
usleep( 6 ms) slept really 6.149 ms
usleep( 7 ms) slept really 7.149 ms
usleep( 8 ms) slept really 8.150 ms
usleep( 9 ms) slept really 9.150 ms
usleep(10 ms) slept really 10.150 ms
usleep(11 ms) slept really 11.149 ms
usleep(12 ms) slept really 12.149 ms
usleep(13 ms) slept really 13.150 ms
usleep(14 ms) slept really 14.150 ms
usleep(15 ms) slept really 15.149 ms
usleep(16 ms) slept really 16.149 ms
usleep(17 ms) slept really 17.150 ms
usleep(18 ms) slept really 18.150 ms
usleep(19 ms) slept really 19.149 ms
usleep(20 ms) slept really 20.149 ms

关于c++ - `std::this_thread::sleep_for()` 是否有任何特定于平台的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660320/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com