【问题标题】:Sleep() sleeps too longSleep() 睡眠时间过长
【发布时间】:2020-10-24 15:04:35
【问题描述】:

Windows Server 2016/2019 存在问题 在一个典型的循环中“进行”1000 次重复,停顿 1 毫秒。

  for (int i = 0; i <1000; i ++)
  {
      Thread.Sleep (1);
  }

服务器处理每个睡眠周期 - 15 毫秒。自 1000 个请求以来。 而不是 1000 毫秒。 (1 秒) 执行 15000 毫秒。 (15 秒)

在家用电脑上没问题。仅在服务器上存在此问题。 我怀疑 CPU 是罪魁祸首。

【问题讨论】:

  • 我的猜测是,在您的家用 PC 上,您正在运行 Chrome,它可以将计时器加速到 1 毫秒的分辨率。另一方面,服务器使用默认的 15 毫秒分辨率,这对于服务器工作负载来说更好。 (您不希望您的服务器经常中断。)家用 PC 上的行为是 likely to change soon,因此只有请求更高计时器分辨率的程序才能获得它。

标签: windows memory cpu


【解决方案1】:

一般情况下:只保证睡眠至少在指定的时间 - 不是确切的时间。您将获得下一个 timseslot 进行处理 - 最简单的解决方案 - 不要旋转和睡眠 - 如果你想拥有它,睡眠 1000 毫秒 - 所以你会更接近 1 秒的睡眠。通过循环 1000 次,您的“稍微大一点的睡眠”总结起来。

参见 f.e. C# 在这里:sleep() - 更一般地,Windows 在这里休眠:win32/api/synchapi/nf-synchapi-sleep

Source:

经过休眠间隔后,线程就可以运行了。如果您指定 0 毫秒,线程将放弃其时间片的剩余部分但保持就绪状态。请注意,不保证就绪线程会立即运行。因此,线程可能要等到休眠间隔过去一段时间后才能运行。有关详细信息,请参阅调度优先级。

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2017-07-25
    相关资源
    最近更新 更多